2010-11-11 93 views
2

我對C非常陌生,並且在使用fwrite時遇到了麻煩。如何使用fwrite將結構寫入文件?

我期待使用擁有兩個值的結構:

struct keyEncode{ 
    unsigned short key[2]; 
    unsigned short encoded[2]; 
}; 

然後我宣佈我的結構,並在我的主要一個指向結構:

struct keyEncode keynEncode; 
struct keyEncode *storedVal = &keynEncode; 

我就將值賦給在結構和想用fwrite來寫結構到一個文件:

keynEncode.key[0] = k1[0]; 
keynEncode.key[1] = k1[1]; 
keynEncode.encoded[0] = p[0]; 
keynEncode.encoded[1] = p[1]; 
// i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors 

fwrite(storedVal, sizeof(storedVal), 0xffff, fp); 

現在我的問題爲t帽子fwrite什麼都不寫入文件。

我哪裏錯了?

+1

刪除C++標籤,因爲這是C代碼是學習:)。 – 2010-11-11 15:08:41

+0

什麼是0xffff?你正在寫65K的記錄?不,這裏應該是1. – Vovanium 2010-11-11 15:11:13

+0

你在做什麼是可以想象的,但是一般來說,編譯器允許在這裏的struct成員之間插入填充。因此,只需將'struct'的二進制表示寫出到磁盤就不會在編譯器和/或編譯器版本和/或編譯器設置之間產生一致的結果。 – 2010-11-11 15:11:26

回答

14

您在使用指針sizeof,這將不計算有效結構的大小,但指針的一個(可能是4或8字節)。試用sizeof(struct keyEncode)(如果您使用C++,則sizeof(keyEncode)就足夠了)。

然後我不明白你爲什麼有0xFFFF作爲計數,不應該只是1

+0

+1用於查找問題的大小。 – 2010-11-11 15:10:15

+0

好的非常感謝你,我真的不明白在fwrite中的第三個參數,如果你可以給一些洞察力,將是偉大的? – molleman 2010-11-11 15:12:13

+0

另外我想寫的結構的值到一個二進制文件 – molleman 2010-11-11 15:13:01

4

假設你只有一個這樣的結構,那麼你需要改變:

fwrite(storedVal, sizeof(storedVal), 0xffff, fp);

fwrite(storedVal, sizeof(*storedVal), 1, fp);

+0

'sizeof(storedVal)'將給出指針的大小,而不是指向的類型。應該是sizeof(* storedVal)' – 2010-11-11 15:10:37

+0

sizeof(storedVal)不正確。你想sizeof(keyEncode) – 2010-11-11 15:10:50

+0

@Worrier,@Paul:我想上面的兩條評論可能是在我編輯的時候寫的。 – 2010-11-11 15:12:38

0
FILE *fp = fopen("c:\\test", "wb"); 
if (fp != NULL) { 
    fwrite(storedVal, sizeof(keynEncode), 1, fp); 
    fclose(fp); 
} 
+0

請注意,storedVal是一個**指針** – 2010-11-11 15:10:51

+0

另外,在前兩行中,'file'應該是'fp'。 – 2010-11-11 15:12:47

+0

修復了問題 – 2010-11-11 15:31:21

0
// i tried to use storedVal.key[0] = k1[0]; but i was getting compile errors 

對於這一個。 storedVal是一個指向結構體的指針。 C'S指針引用運營商 - >所以你要

storedVal->key[0] = k[0]; 
1

的參數fwrite()要打印的數據,一個數據項的大小,數據項的數目,文件指針。

你有兩個問題大小:

  1. 你指定「sizeof(storedVal)」,這是一個指針的大小 - 而不是結構的大小。
  2. 您指定需要寫入65,535個。

所以,你需要使用:

if (fwrite(storedVal, sizeof(*storedVal), 1, fp) != 1) 
    ...error handling... 

注意fwrite()返回寫入的項目數。在一般情況下,你必須n項目寫的,你應該檢查:

if (fwrite(storedVal, sizeof(*storedVal), n, fp) != n) 
    ...error handling... 
0

看看你的變量定義,並期待在您使用的電話的sizeof其中之一。指定指針的大小而不是數據的大小是正確的嗎?另外檢查你的fwrite的用法,我想你是錯誤地指定了「count」參數。它被定義爲

size_t fwrite (const void * ptr, size_t size, size_t count, FILE * stream); 

計數參數指定要寫入到文件的大小大小的塊的數目

我真的不希望給你答案的時候了(別人可能會),因爲這被標記爲功課 - 你應該