簡體   English   中英

在C中使用fread()從二進制文件讀取時的奇怪值

[英]Strange value when reading from binary file with fread() in C

我有一個無法解決的問題...

我使用fwriteint值(以及其他來自struct值)寫入使用fopen(file, "wb");

這很好用,當我查看文件的內容時,我可以看到我“編寫”的intHEX值(以及所有其他值)。

接下來,我嘗試讀取文件。 因此,我使用fopen(file, "rb"); 然后使用fread開始閱讀。 正確讀取第一個int值(例如7),然后讀取所有其他值-屬於我編寫的第一個struct

然后,我嘗試讀取下一個struct ,當我嘗試讀取第一個int值時,我收到一個非常奇怪的數字(例如1140850688),但應該改為39。

所以問題是:為什么會這樣? 我該如何解決呢?

我的struct看起來像這樣:

struct a {
    int a1;
    char* a2;
    struct b* a3;
    unsigned char a4; 
    int a5;
    char* a6; 
}

fread調用看起來像這樣: fread(&(tmpA->a1), sizeof(int), 1, file);

編輯:

fwrite部分:

fwrite(&(tmpA->a1), sizeof(int), 1, file);
fwrite(tmpA->a2, sizeof(char), strlen(tmpA->a2), file);
fwrite(tmpA->a3, sizeof(struct b), 1, file);
fwrite(&(tmpA->a4), sizeof(unsigned char), 1, file);
fwrite(&(tmpA->a5), sizeof(int), 1, file);
fwrite(tmpA->a6, sizeof(char), strlen(tmpA->a6), file);

fread幾乎是一樣的。

如果您從文件中編寫了一個struct ,則應該讀回一個struct 試圖讀取一個int是行不通的。 但是,很少,如果有的話,兩個包含指針的struct以二進制形式寫出是有意義的。 您應該使它們成為固定大小的數組,或者與struct分開序列化它們。

編輯:(響應已發布的代碼)最可能的問題與在fwrite的第二次調用中寫入未知數量的字符有關。 序列化C字符串時,應在寫出字符本身之前先寫出字符數,以便在讀取時可以知道要分配和讀回多少個字符:

int len = strlen(tmpA->a2);
fwrite(&len, sizeof(int), 1, file);    
fwrite(tmpA->a2, sizeof(char), len, file);
...
fread(&(tmpA->a1), sizeof(int), 1, file);
tmpA->a2 = malloc(tmpA->a1+1);
fread(tmpA->a2, sizeof(char), tmpA->a1, file);
tmpA->a2[tmpA->a1] = '\0';

我懷疑你的問題在這條線上

fwrite(tmpA->a3, sizeof(struct b), 1, file);

您正在編寫struct 根據此Wikipedia文章 ,此結構將具有填充字節,這將抵消您的其余數據。 您可能必須提出一種更好的將結構寫入內存的方法。 此頁面提供其他說明。

您可以通過檢查a4是否具有您期望的值,或者將整個結構的大小與其成員的大小之和進行比較,來查看是否確實存在問題。

另外,這些行看起來很危險:

fwrite(tmpA->a2, sizeof(char), strlen(tmpA->a2), file);
fwrite(tmpA->a6, sizeof(char), strlen(tmpA->a6), file);

他們說要打印的字符串的長度可能在您存儲的數據中有所不同。 strlen會為您提供字符串的長度,而不會計算結尾的\\0因此一旦寫入,就沒有很好的方法知道字符串的結尾。 我無法想象你打算如何讀回字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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