【问题标题】: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)会消耗一个字符

标签: c pointers input integer eof


【解决方案1】:

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

【讨论】:

  • 因为do{}while();先执行后测试。
  • 请记住,对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】:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多