7

重複の可能性:
「while( !feof( file ) )」は常に間違っています

出力ファイルに配列を書き込んでファイルを閉じると、ファイルを再度開き、ファイルの終わりに達するまですべてを読み取ります.ファイルには4つの数値しか含まれていませんが、プログラムは5つの数値を読み取って出力します. ?

プログラム出力:

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

save.bin (16 進エディタを使用)

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;
}
4

3 に答える 3

11

feof(fp)ファイルの終わりを超えて読み取ろうとした場合にのみ、false (つまり、ゼロ以外の値)になります。これは、ループが予想よりも 1 つ多く入った理由を説明するはずです。

ドキュメントから:

  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?

于 2012-08-23T15:22:48.587 に答える
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 に到達し、ループが他の障害によって終了していないことを確認します。

于 2012-08-23T15:21:26.607 に答える
1

私も同じ問題を抱えています。代わりにこれを試してください:

i=0;
  while(true)
  {
    fread(&k,sizeof(int),1,f);
    if(feof(f))
        break;

    printf("a[%d] = %d\n",i,k);
    i++;
  }

どうやら、ファイルの最後まで読んでいない限り、feof は true を返さないようです。配列をバイナリ ファイルに書き込むときに行うことは、最初にサイズを書き込むことです。そのため、読み返すときに読み込もうとしているデータの正確な量がわかります。

于 2012-08-23T15:31:54.123 に答える