【问题标题】:C reading binary files [duplicate]C读取二进制文件[重复]
【发布时间】:2012-08-19 03:58:54
【问题描述】:

可能重复:
“while( !feof( file ) )” is always wrong

如果我将数组写入输出文件并关闭文件,然后再次打开文件并读取所有内容,直到到达文件结尾,虽然文件仅包含 4 个数字,但程序将读取并打印 5数字,为什么?

程序输出:

a[0] = 4
a[1] = 7
a[2] = 12
a[3] = 34
a[4] = 34

save.bin(带有十六进制编辑器)

04000000 07000000 0C000000 22000000

#include <stdio.h>
#include <stdlib.h>
#define path "save.bin"

int main(void)
{
  FILE *f=NULL;
  int a[]={4,7,12,34},i,n=4,k;
  f=fopen(path,"wb");
  if(f==NULL)
  {
    perror("Error");
    exit(1);
  }
  for(i=0;i<n;i++)  // or I could use fwrite(a,sizeof(int),n,f);
    fwrite(&a[i],sizeof(int),1,f);
  fclose(f);
  f=fopen(path,"rb");
  if(f==NULL)
  {
    perror("Error");
    exit(1);
  }
  i=0;
  while(!feof(f))
  {
    fread(&k,sizeof(int),1,f);
    printf("a[%d] = %d\n",i,k);
    i++;
  }
  printf("\n");
  fclose(f);
  return 0;
}

【问题讨论】:

    标签: c file binaryfiles


    【解决方案1】:
    while(!feof(f))
    {
        fread(&k,sizeof(int),1,f);
        printf("a[%d] = %d\n",i,k);  /** THIS ASSUMES fread() WAS SUCCESSFUL. **/
        i++;
    }
    

    在调用fread() 后立即检查文件结尾或检查fread() 的返回值,它返回读取的项目数,在这种情况下应该是1。循环的可能重组:

    while(1 == fread(&k,sizeof(int),1,f))
    {
        printf("a[%d] = %d\n",i,k);
        i++;
    }
    

    循环后检查feof() 以确保到达EOF 并且循环没有因其他故障而结束。

    【讨论】:

      【解决方案2】:

      feof(fp) 只有在您尝试读取文件末尾时才会变为假(即非零值)。这应该可以解释为什么输入的循环比您期望的多一个。

      来自documentation

        The function feof() tests the end-of-file indicator for the stream
        pointed to by stream, returning nonzero if it is set.  The end-of-
        file indicator can be cleared only by the function clearerr().
      

      另请阅读帖子:Why is “while ( !feof (file) )” always wrong?

      【讨论】:

      • +1 用于解释如何设置 feof()
      【解决方案3】:

      我也有同样的问题。试试这个:

      i=0;
        while(true)
        {
          fread(&k,sizeof(int),1,f);
          if(feof(f))
              break;
      
          printf("a[%d] = %d\n",i,k);
          i++;
        }
      

      显然 feof 不会返回 true,除非您已阅读文件末尾。我在将数组写入二进制文件时所做的是先写入大小,这样我就知道在读回数组时要读取的确切数据量。

      【讨论】:

        猜你喜欢
        • 2017-10-01
        • 2011-09-03
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2019-02-20
        • 2015-08-22
        • 2011-10-20
        相关资源
        最近更新 更多