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

Read a file with unknown number of lines in C using fscanf

我试图在这里和 Internet 上的其他地方搜索答案,但没有得到我要找的东西。我有一个如下所示的数据文件:

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);

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

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

#include

int main(){ 文件*file_ptr_edges; file_ptr_edges = fopen("myfile.dat", "r"); int u, v, eof; 整数 r = 1; while (r != EOF){ r = fscanf(file_ptr_edges, "%d,%d\n", &u, &v); printf("u = %d,v = %d\n", u, v); printf("%d\n", r); } fclose(file_ptr_edges);

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 的值是如何变化的。

您需要在 fscanf() returns EOF(文件结尾)时终止循环:

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

注意,u仅对r > 0有效,vr == 2有效。我不知道 r == 0r == 1.

你想要什么行为

您需要检查 fscanf 的结果(以及您调用的每个其他标准库函数 returns 结果)。

The fscanf function returns the value of the macro EOF if an input failure occurs before the first conversion (if any) has completed. Otherwise, the function returns the number of input items assigned, which can be fewer than provided for, or even zero, in the event of an early matching failure.

像这样的东西应该可以工作:

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

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