在不移动文件指针的情况下检查文件指针是否已达到EOF?

时间:2013-08-05 05:29:24

标签: c pointers input integer eof

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

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

请记住,我将使用此循环执行比使用整数扫描更复杂的操作。另外,我不知道我使用fscanf而不是fgets。它只是一个简单的例子,向您展示我的意思。

while(fgetc(ifp) != EOF)
{

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

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

2 3 4 五 6 7 8 9 10

缺少1!

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

您应该将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);
}

特别是对于调试,将事物拆分为可以检查的变量的单独语句可能会很好。

答案 2 :(得分:3)

由于各种原因,如果没有实际执行文件的先前读取,就无法确定是否已达到EOF。

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

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

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

答案 3 :(得分:3)

简单地说:

while (fscanf (ifp, "%d", &test) != EOF)
    printf("%d\n", test);

答案 4 :(得分:2)

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

相反使用: -

while(1)
{

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

答案 5 :(得分:0)