樣本程序如下:
#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);
}