fscanf 不扫描任何数字

fscanf not scanning any numbers

我目前正在开发一个简单的 C 应用程序。它以单个文件作为命令行参数,其格式如下:

1,2,3
4,5,6
7,8,9
etc.

然而,无论出于何种原因,fscanf从不扫描号码!这是一个例子:

#include <stdio.h>

int main(int argc, char **argv) {
    FILE *file = fopen(*argv, "r");
    int i1, i2, i3;
    while (fscanf(file, "%d,%d,%d", &i1, &i2, &i3) == 3) {
        printf("Doing stuff with %d, %d, and %d...\n", i1, i2, i3);
    }
    fclose(file);
    return 0;
}

如果你 运行 它以文件名作为参数,那么它会立即退出,因为 fscanf 返回 0。我已经尝试了几种变体,但无济于事。如何让 fscanf 正确读出数字?

正如 BLUEPIXY 所指出的,您应该使用 argv 数组的第二个元素:argv[1]:

FILE *file = fopen(argv[1], "r");

第一个元素(argv[0]*argv)是正在执行的程序的名称 - 它不是要打开的正确文件。

肤浅的回答:打开了错误的文件,因为代码应该使用 argv[1] 而不是 *argv

让我们看得更深。

代码有问题并且至少在 2 个地方缺少错误检查。

  1. FILE *file = fopen(*argv, "r"); 之后没有对 file 进行测试。这种经典检查不会检测到 OP 的问题,因为文件(可执行文件)是 open-able.

  2. 来自 fscanf(file, "%d,%d,%d", &i1, &i2, &i3) 的 return 值仅经过轻微测试。 Return 的值 EOF 0 1 2 3 是可能的,但只有 EOF 3 是预期的。如果针对非 EOF 3 测试代码,问题很快就会被发现。

要吸取的教训:确保代码,尤其是 mis-behaving 代码,具有足够的错误检查。在长 运行.

中节省编码器时间
#include <stdio.h>

int main(int argc, char **argv) {
  if (argc != 2) {
    fprintf(stderr, "Unexpected argument count %d.\n", argc);
    return 1;
  } 
  FILE *file = fopen(argv[1], "r");
  if (file == NULL) {
    fprintf(stderr, "Unable to open file: \"%s\"", argv[1]);
    return 1;
  } 
  int i1, i2, i3;
  int n;
  while ((n = fscanf(file, "%d,%d,%d", &i1, &i2, &i3)) == 3) {
    printf("Doing stuff with %d, %d, and %d...\n", i1, i2, i3);
  }
  if (n != EOF) {
    fprintf(stderr, "Unexpected scan failure count %d\n", n);
    return 1;
  }
  fclose(file);
  return 0;
}