fscanf不扫描任何数字

时间:2016-01-27 13:27:21

标签: c scanf format-specifiers

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

表面答案:错误的文件被打开,因为代码应该使用argv[1]而不是*argv

让我们看一下。

代码在至少2个地方遇到麻烦并且没有错误检查。

  1. FILE *file = fopen(*argv, "r");未在file上进行测试。这个经典的检查不会检测到OP的问题,因为可执行文件是可以打开的。

  2. fscanf(file, "%d,%d,%d", &i1, &i2, &i3)的返回值只是经过了轻微的测试。 EOF 0 1 2 3的返回值是可能的,但预计只有EOF 3。如果对非EOF 3进行了代码测试,则很快就会发现问题。

  3. 需要学习的课程:保证代码,尤其是错误代码,有足够的错误检查。从长远来看,节省了编码时间。

    #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;
    }