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)
在 循环之外,否则你会得到一个无限循环(除非文件小于结构的大小,这是另一个函数错误)
旁白:xp
是 FILE
不透明结构上的指针。即使有多个 fread
,它也不会改变。哪些更改是一些隐藏的 offset
值。但是除非您在句柄上调用 ftell
,否则您无法获得该信息。
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)
在 循环之外,否则你会得到一个无限循环(除非文件小于结构的大小,这是另一个函数错误)
旁白:xp
是 FILE
不透明结构上的指针。即使有多个 fread
,它也不会改变。哪些更改是一些隐藏的 offset
值。但是除非您在句柄上调用 ftell
,否则您无法获得该信息。