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
返回的内容,顺便说一句,它应该返回读取的元素数,所以如果没有,并且返回 0 或 -1 有问题),该句柄上的 feof
也是如此(好吧,实际上这是未定义的行为,如下所述: What is the return value of feof() on a closed file? )
你的意思是在循环之外调用fclose(xp)
外部,否则你会得到一个无限循环(除非文件小于结构的大小,这是另一个功能错误)
旁白:xp
是一个指向FILE
不透明结构的指针。即使多次读取,它也不会改变。其中的变化是一些隐藏的offset
值。但除非您在句柄上调用 ftell
,否则您无法获取该信息。
关于c - fread 不会更改函数中的指针值(导致带有 feof 的无限循环)-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975608/