【问题标题】:fread doesn't change the pointer value in a function ( Cause infinite Loop with a feof ) - Cfread 不会更改函数中的指针值(使用 feof 导致无限循环)-C
【发布时间】:2019-03-29 06:13:29
【问题描述】:
int ricerca_copia(int x,int xf)
{

FILE *xp;
int conf;
int f;
int xeof;

f=0;
// file was already written and closed before this function
xp=fopen("prenotazioni_copy.dat","rb");
if(xp)
{
  xeof=0;

  while(xeof==0)
  {
    //Never changes xp value
    fread(&appoggio,sizeof(appoggio),1,xp);
    if(feof(xp))
    {
     //never enters here

        xeof=1;
    }
    else
    {
            //other stuff
    }
    fclose(xp);

  }
}
printf("\nValore %d",f);
return f;
}

fread 不会改变指针 (xp) 的值,所以 xeof 值保持为 0 并且循环重新开始

我已经测试过在这个函数的外部使用这部分代码并且它可以工作,所以问题是这样的。

我真的不知道怎么解决,有什么解决办法吗?

【问题讨论】:

  • 尝试并拥有完整的示例。这里appoggio 从未定义,所以它的类型未知。您还需要检查每个操作的错误,而不仅仅是其中的一些。
  • fread 有一个您必须检查的返回值。如果它不等于您传递的nmemb那么必须检查errnoferror 以确定是否发生错误。跨度>

标签: c windows codeblocks infinite-loop fread


【解决方案1】:

问题是您在循环中调用了fclose(xp)

第一次迭代工作正常,但下一次 fread 调用失败(你应该检查 fread 返回 BTW,它应该返回读取的元素数,所以如果它没有返回 0 或 -1,则一个问题),该句柄上的feof 也是如此(嗯,实际上它是此处所述的未定义行为:What is the return value of feof() on a closed file?

你的意思是在循环之外调用fclose(xp),否则你会得到一个无限循环(除非文件小于结构的大小,这是另一个功能错误)

旁白:xpFILE 不透明结构上的指针。即使有多个fread,它也不会改变。哪些变化是一些隐藏的offset 值。但是,除非您在句柄上调用ftell,否则您无法获得该信息。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多