fread 不会更改函数中的指针值(使用 feof 导致无限循环)- C

fread doesn't change the pointer value in a function ( Cause infinite Loop with a feof ) - C

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,循环重新开始

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

不知道怎么解决,请问有什么办法吗?

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

第一次迭代工作正常,但下一次 fread 调用失败(你应该检查什么 fread returns 顺便说一句,它应该 return 元素的数量阅读,所以如果它没有并且 returns 0 或 -1 有问题),那么 feof 在那个句柄上也是如此(好吧,实际上它是未定义的行为,如下所述:What is the return value of feof() on a closed file?)

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

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