[英]Strange value when reading from binary file with fread() in C
我有一個無法解決的問題...
我使用fwrite
將int
值(以及其他來自struct
值)寫入使用fopen(file, "wb");
這很好用,當我查看文件的內容時,我可以看到我“編寫”的int
的HEX
值(以及所有其他值)。
接下來,我嘗試讀取文件。 因此,我使用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.