4

我的问题很简单,但我在谷歌上找不到,所以我在这里。

基本上,作为一个例子,我正在从输入文件中读取一堆整数,直到 EOF。我使用 fgetc 进行检查,但随后它将文件指针移动到第二个整数的地址。如何在这个while循环中检查EOF而不在检查时移动文件指针?

请记住,我将用这个循环做一些比扫描整数更复杂的事情。另外,我知道,不要提及我使用 fscanf 而不是 fgets。它只是一个简单的例子来告诉你我的意思。

while(fgetc(ifp) != EOF)
{

    fscanf(ifp, "%d", &test);
    printf("%d\n", test);
}

例如,如果输入文件有整数 1-10,上面的代码将打印:

2 3 4 5 6 7 8 9 10

错过了1!

4

6 回答 6

7

fgetc返回指定流的内部文件位置指示符当前指向的字符。然后内部文件位置指示器前进到下一个字符。使用do{ }while();将解决您的问题。

于 2013-08-05T05:32:48.030 回答
6

您应该将 EOF 条件视为实现细节。这里真正重要的是 fscanf 是否成功返回了一个值。

while(fscanf(ifp, "%d", &test) == 1) {
    printf("%d\n", test);
}

另一方面,这感觉像是将逻辑置于循环中间是有意义的时代。

while(1) {
    int ret = fscanf(ifp, "%d", &test);
    if (ret != 1)
        break;
    printf("%d\n", test);
}

特别是对于调试,最好将事物拆分为带有可检查变量的单独语句。

于 2013-08-05T05:41:20.187 回答
3

由于各种原因,如果不实际执行文件的事先读取,就不可能确定是否已达到 EOF。

但是,使用单独的函数调用来执行此操作是一个坏主意,即使您要使用它ungetc()来放回您尝试读取的字符。

fscanf()相反,检查对自身的调用的返回值:

while(fscanf(ifp, "%d", &test) == 1)
{
    printf("%d\n", test);
}
于 2013-08-05T05:42:06.330 回答
3

简单地说:

while (fscanf (ifp, "%d", &test) != EOF)
    printf("%d\n", test);
于 2013-08-05T05:42:09.487 回答
2

fgetc(ifp)推进文件指针,因此跳过你的第一个整数

而是使用: -

while(1)
{

    if(fscanf(ifp, "%d", &test)!=1) 
         break;
    printf("%d\n", test);
}
于 2013-08-05T05:32:12.763 回答
0

真正的答案是使用feof

https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/feof.htm

于 2019-02-11T03:49:02.277 回答