为什么我的代码不能停止?使用fscanf

为什么我的代码不能停止?使用fscanf,c,C,我想继续读取文件,直到它结束,但它输出错误答案,无法停止。 我的代码是: #include <stdio.h> #include <stdlib.h> void create() { FILE *fin = fopen("in", "r"); int temp[4], t; int aaa; while ((aaa = scanf(fin, "%d:%d:%d:%d/%d",

我想继续读取文件,直到它结束,但它输出错误答案,无法停止。 我的代码是:

    #include <stdio.h>
    #include <stdlib.h>

    void create() {
        FILE *fin = fopen("in", "r");
        int temp[4], t;
        int aaa;

        while ((aaa = scanf(fin, "%d:%d:%d:%d/%d", 
                      &temp[0], &temp[1], &temp[2], &temp[3], t)) != EOF) {
            printf("%d\n", aaa);
            printf("%d:%d:%d:%d\n", temp[0], temp[1], temp[2], temp[3]);
        }

        fclose(fin);
    }

    int main() {
        create();

        return 0;
    }
但它输出:

0
103:0:0:0
0
103:0:0:0
0
103:0:0:0
....(loop)
  • 您的
    fscanf
    应该在
    %d
    之间具有
    而不是
    ,因为这会导致不匹配
  • 也可以使用
    &t
    而不是
    t
    。参见
    man fscanf
  • 另外
    while(fscanf()!=EOF)
    表示即使出现任何匹配失败,并且
    fscanf
    未能匹配和存储所有5个参数(由于
    不匹配),也要继续循环。
    您应该使用
    while(fscanf()==5)
    仅当
    fscanf
    的所有5个参数都匹配并存储时才继续循环

  • 您的代码有几个问题:

    • 您为最后一个格式说明符传递
      t
      而不是其地址
      &t
      ,调用未定义的行为

    • 格式字符串使用
      而不是
      作为分隔符,导致解析失败

    • fscanf
      返回它成功解析的字段数。只有在文件结束时,若并没有字段可以被解析,它才会返回
      EOF
      。否则,如果输入流中有与格式不匹配的字符,它将停止并返回格式字符串的
      0
      5
      。例如,输入流中的
      将导致您的
      while
      循环永远继续,并返回
      0
      ,因为
      %d
      不匹配这解释了您观察到的当前行为

    您应该将测试更改为:

        while ((aaa = fscanf(fin, "%d.%d.%d.%d/%d",
                         &temp[0], &temp[1], &temp[2], &temp[3], &t)) == 5) {
            printf("%d\n", aaa);
            printf("%d:%d:%d:%d\n", temp[0], temp[1], temp[2], temp[3]);
        }
    

    如果要从
    文件*
    句柄读取,则需要使用
    fscanf()
    而不是
    scanf()

    例如,将
    fin
    作为
    文件*
    在此处:

    while (fscanf(fin, "%d:%d:%d:%d/%d",
                  &temp[0], &temp[1], &temp[2], &temp[3], &t) != EOF) { ... }
    

    fscanf()
    与5进行比较,而不是
    EOF
    。请不要从注释和答案中建议的修复中更正代码,这会导致不一致。
    while (fscanf(fin, "%d:%d:%d:%d/%d",
                  &temp[0], &temp[1], &temp[2], &temp[3], &t) != EOF) { ... }