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

Posted

技术标签:

【中文标题】在不移动文件指针的情况下检查文件指针是不是已达到 EOF?【英文标题】:Checking if the file pointer has reached EOF without moving the file pointer?在不移动文件指针的情况下检查文件指针是否已达到 EOF? 【发布时间】:2013-08-05 17:51:09 【问题描述】:

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

基本上,作为一个例子,我正在从输入文件中读取一堆整数,直到 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!

【问题讨论】:

因为fgetc(ifp)会消耗一个字符 【参考方案1】:

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

【讨论】:

因为dowhile();先执行后测试。 请记住,对fgetc() 的调用将吞噬分隔整数的空白字符之一;虽然它确实有效。这对我来说很难闻......【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

while(fscanf(ifp, "%d", &test) == 1)

    printf("%d\n", test);

【讨论】:

【参考方案4】:

简单地说:

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

【讨论】:

不起作用:fscanf() 可能返回 EOF,这是一个真实值【参考方案5】:

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

改为使用:-

while(1)


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

【讨论】:

不,检查this @DavidRF 检查上下文,OP 案例不太具体 while(!feof(ifp)) 这是错误的,因为(在没有读取错误的情况下)它进入循环的次数比作者预期的多一次。如果出现读取错误,则循环永远不会终止。 你能给我一个导致无限循环的读取错误的例子吗?我只是好奇。 现在您的代码没有错误,但feof 没有任何意义:他的指标通常由流上的先前操作设置,该操作尝试在结束时或结束时读取-文件,只需使用while(fscanf(...) == 1)【参考方案6】:

真正的答案是使用feof

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

【讨论】:

以上是关于在不移动文件指针的情况下检查文件指针是不是已达到 EOF?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不进行查询的情况下读取指针

在不显示指针地址的情况下访问指针数据

我应该如何在不使用 C++ 中的构造函数的情况下将值(不是指针)转换为子类?

在WIN32系统中,如何在不使用LARGE_INTEGER数据的情况下以重叠结构递增文件指针的n个字节?

如何在不检查路径扩展名的情况下检查文件是不是为图像文件?

如何在不发送任何内容的情况下检查频道是不是已满[重复]