簡體   English   中英

C二進制文件讀取

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM