代码之家  ›  专栏  ›  技术社区  ›  Peaceful

使用fscanf读取C中具有未知行数的文件

  •  0
  • Peaceful  · 技术社区  · 2 年前

    我试图在这里和互联网上的其他地方寻找答案,但没有得到我想要的答案。我有一个如下所示的数据文件:

    0,4
    0,6
    0,9
    0,10
    1,5
    1,7
    1,9
    2,6
    2,8
    2,10
    3,4
    3,7
    

    我可以使用 fscanf 没有任何问题。但是,我不知道文件中的行数。我尝试过在大量迭代中使用for循环:

    int u, v;
    FILE *ptr = fopen("myfile.dat", "w");
    for (int i=0; i < 1000000; ++i){
        fscanf(ptr, "%d,%d\n", &u, &v);
    }
    fclose(ptr);
    

    但是,这会在读取前几行之后重复读取文件的最后一行。为什么会这样?我如何正确地解决我的问题,以便我能够正确地读取未知行数的文件?

    编辑: 下面是我在看到下面的一些答案后尝试的最简单的工作示例。

    #包括<斯特迪奥。h>

    int main(){ 文件*文件边缘; file_ptr_edges=fopen(“myfile.dat”,“r”); int u,v,eof; int r=1; 而(r!=EOF){ r=fscanf(文件边、%d、%d\n、&u和&v); printf(“u=%d,v=%d\n”,u,v); printf(“%d\n”,r); } fclose(文件边缘);

    return 0;
    

    }

    输出:

    u = 0,v = 4
    2
    u = 0,v = 6
    2
    u = 0,v = 9
    2
    u = 0,v = 10
    2
    u = 1,v = 5
    2
    u = 1,v = 7
    2
    u = 1,v = 9
    2
    u = 2,v = 6
    2
    u = 2,v = 8
    2
    u = 2,v = 10
    2
    u = 3,v = 4
    2
    u = 3,v = 7
    2
    u = 3,v = 7
    -1
    

    因此 r 似乎很有价值 -1 当到达最后一行时。这解决了我的问题,尽管我不明白 R 我们正在改变。

    2 回复  |  直到 2 年前
        1
  •  3
  •   n. m. could be an AI    2 年前

    你需要检查测试结果 fscanf (以及您调用的所有其他返回结果的标准库函数)。

    如果在第一次转换(如果有)完成之前发生输入故障,fscanf函数将返回宏EOF的值。否则,该函数将返回分配的输入项的数量,如果早期匹配失败,该数量可以小于提供的数量,甚至可以为零。

    像这样的方法应该有用:

    while (fscanf(ptr, "%d,%d\n", u, v) == 2) {
       // do something with the numbers
    }
    if (feof(stdin)) {
       // the file was read to the end
    } else {
       // there was an error
       perror ("Could not read the input");
    }
    

    另外,请阅读 A beginners' guide away from scanf() .

        2
  •  2
  •   Allan Wind    2 年前

    您需要在以下情况下终止循环: fscanf() 返回 EOF (文件末尾):

    int r = fscanf(ptr, "%d,%d\n", &u, &v);
    if(r == EOF) break;
    

    笔记 u 只适用于 r > 0 v 对于 r == 2 .我不知道你想要什么样的行为 r == 0 r == 1 .