[英]C binary file reading
我在讀取二進制文件時遇到了一些問題,而最后一條記錄被重讀了兩次。 我輸入了4條記錄,但是打印了5條記錄,始終打印了兩次打印的最后一條記錄。
int main ()
{
FILE *fp;
fp = fopen( "file" , "a+" );
struct clientsData {int num1; int num2; char str[20]; };
if (getchar()=='w')
{
int n1,n2;
char name[20];
scanf("%d",&n1);
scanf("%d",&n2);
scanf("%s",name);
struct clientsData client;
client.num1=n1;
client.num2=n2;
strncpy(client.str,name, 20);
fwrite(&client , 1, sizeof(struct clientsData) , fp );
}
else
{
while (!feof(fp))
{
struct clientsData client;
fread(&client, 1, sizeof(struct clientsData) , fp);
printf("%d\t%d\t%s\n",client.num1, client.num2, client.str);
}
}
fclose(fp);
return(0);
}
輸出:
1 1 asd
2 3 asd
23 90 player
23 23 marin
23 23 marin
這個問題源於feof
工作方式。 如果超出文件限制,則返回true(如果您嘗試讀取最后一個字符后的內容)。 所以,你的程序目前的工作方式是:讀取最后一個有效數據並打印它,嘗試再次讀取數據(fread失敗,數據結構內容相同,打印它(你獲得相同的輸出),feof返回現在是,因為你試圖讀過文件的末尾,所以循環結束。
正確的方法是:
struct clientsData client;
while (fread(&client, 1, sizeof(struct clientsData) , fp) == sizeof(struct clientsData))
{
printf("%d\t%d\t%s\n",client.num1, client.num2, client.str);
}
請注意,這也更有效,因為您不會調用feof。
feof()僅在嘗試讀取文件末尾后返回true; 檢查來自fread的返回值以確保它實際返回數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.