c fread()在判斷文件結束時需要注意的一些事


樣本程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int ele1;
int ele2;
char ch[20];
}ttt;   //結構體.

void addInfo(int *n)
{
FILE *file=fopen("wmx.dat","w");
int i=0;
ttt myttt;
for(i=0;i<10;i++)   //初始化文件,輸入10條記錄.
{
  myttt.ele1=((i+100)*7+i)%107;
  myttt.ele2=((i+309)*5+65)%43;
  strcpy(myttt.ch,"dkldfjd");
  (*n)++;
  fwrite(&myttt,sizeof(ttt),1,file); //寫入.
}
fclose(file);
}

void readFile(int  *n)
{
FILE *file=fopen("wmx.dat","r");
ttt myttt;
if(file==NULL)
     {
      printf("打開文件失敗.\n");
      exit(0);
     }
     while(!feof(file))         //此處打印的最結果是11條記錄.
     {
      fread(&myttt,sizeof(ttt),1,file);
      printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
     // (*n)++;
     }
     fclose(file);
}
int main()
{
int n=0;
addInfo(&n);
readFile(&n);
printf("%d\n",n);
return 0;
}

問題處在fread上,用feof判斷有問題,可以改為:
while (1)
{
    memset(&myttt, 0, sizeof(myttt));
    if (fread(&myttt, sizeof(ttt), 1, file) == 1)
    {
        printf();
    }
    else
    {
        break;
    }
}

 

原因:feof(file) 的作用是檢測讀取到的數據是否為文件結束。讀完最后一行記錄后,file->_flag 沒有被置為_IOEOF,因為已經讀取到記錄了, feof() 沒有探測到文件結尾。直到再次調用 fread()讀取記錄時,才獲取文件結束標志,feof() 探測到文件結尾。
當再次調用 fread(&myttt,sizeof(ttt),1,file); 時,myttt 沒有獲取任何內容,還是上次讀取的數據,輸出時,當然是跟上次一樣。
修改如下:
void readFile(int  *n)
{
FILE *file=fopen("wmx.dat","r");
ttt myttt;
if(file==NULL)
{
printf("打開文件失敗.\n");
exit(0);
}
// 檢測文件長度,如果大於 0,先讀取一行。
if(file->_bufsiz>0)
{
fread(&myttt,sizeof(ttt),1,file);
}
while(!feof(file)) //此處打印的最結果是11條記錄.
{
printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
// 當讀取完數據后,讀取出文件結束標志,
// 回到 while 時,就不再輸出下一行了。
fread(&myttt,sizeof(ttt),1,file);
}
fclose(file);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM