2017-05-20 28 views
0
typedef struct student 
{ 
    char name[10]; 
    int roll; 
    char subject[5]; 
    int mark; 
}STUDENT; 

我使用的fwrite和上面的fread在file.Now結構來存儲存儲在文件中學生記錄後,我修正結構如下的fread()操作補給錯誤數據轉換成結構

typedef struct student 
{ 
    char name[10]; 

    char subject[5]; 
    int mark; 
}STUDENT; 

現在我正在讀舊的記錄,這是我之前存儲在file.I使用fread()來做到這一點。問題是數據沒有正確地從主題中的文件中讀取和標記數據成員的結構。

回答

0

這取決於你如何閱讀文件。如果fread進入新結構使用sizeof(student),因爲缺少「roll」,則在新結構中將舊卷值讀入subject[5]。您可以使用fscanf將該值明確加載到每個字段中。

0

這是因爲該文件仍然包含舊結構中的數據。它總共是10 +(+ 2)+ 4 + 5 +(+ 3)+3(+1)= 28字節 - 括號中的值是struct padding。

當你fread到含有舊格式的數據文件中的新結構,4個字節的int roll;將在第一個4個字節char subject[5];結束,而subject倒數第五元素將是第一個字節前subject。類似的想法適用於mark字段。

如果你想讀取和寫入這樣的結構 - 即通過做它的二進制副本 - 你需要保留舊的格式,即使它不再被使用。更好的主意是使用某種序列化庫。谷歌的「協議緩衝區」只是這類庫的很多例子之一,它可能會讓你知道這類問題是如何解決的。

+0

謝謝,請你提供任何參考序列化庫入門,這將是很大的幫助。 – user5979363

+0

@ user5979363在協議緩衝區的情況下,我提到你可以在這裏找到一個很好的教程:https://developers.google.com/protocol-buffers/docs/cpptutorial –