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

标签 c windows codeblocks infinite-loop fread

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/

相关文章:

c - 枚举和一个以字符串形式返回月份名称的函数

c - GCC 以双机器字类型(包括 asm)访问高/低机器字

windows - 主机名是否保证是有效的 Windows 目录名称?

c++ - 'W' 打印出 W, "W"打印出 $。为什么?

c++ - 如何添加文件以在代码块中构建和读取它们?

c++ - 在 Ubuntu 上使用 RakNet 源码和 Code::Blocks

c++ - 逗号作为分隔符和运算符

c - cs50 的可读性。在 "if"行无缘无故地进行了有值(value)的更改

c++ - Windows GUI 以及控制台应用程序

java - 库路径不应该默认为工作区路径吗?