2013-06-26 43 views
1

我有下面的示例C代碼將intchar array寫入Linux OS上的文件。通過fwrite將二進制文件的int值寫入

int main(void){ 
    struct eg{ 
     int x; 
     char y[3]; 
    }; 

    struct eg example_array[5] = {{ 0, {0}}}; 

    int i; 
    for(i=0;i<3;i++){ 
     example_array[i].x = i; 
     strcpy(example_array[i].y,"12"); 
    } 

    FILE *fp; 
    fp = fopen("/home/ubuntu/example", "wb"); 
    fwrite(&example_array, sizeof(struct eg), 5, fp); 
    fclose(fp); 

return 0; 
} 

nano example顯示內容爲^@^@^@^@12^@^@^A^@^@^@12^@^@^B^@^@^@12^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

hexedit example其顯示爲

00000000 00 00 00 00 31 32 00 00 01 00 00 00 31 32 00 00 02 00 00 00 31 32 00 00 00 00 00 00 ....12......12......12...... 
0000001C 00 00 00 00 00 00 00 00 00 00 00 00              ............ 

我沒有看到二進制文件example_array[i].x值。任何人都可以告訴我,我應該如何在上面的代碼中使用fwrite

^@^@^@^@^@......代表什麼?他們是空白的嗎?

+2

你在什麼架構?你知道x86是小端,對嗎? –

+0

是的,我在x86上,但我會在armv4l體系結構上編譯代碼 – sven

回答

2

^X使用不可打印的ASCII值對字節進行編碼。 ^@表示0,^A表示1,^B表示2等。

int ch[] padding 
-------- ---- ------- 
^@^@^@^@ 12^@ ^@ 
^A^@^@^@ 12^@ ^@ 
^B^@^@^@ 12^@ ^@ 
^@^@^@^@ ^@^@ ^@ 
^@^@^@^@ ^@^@ ^@ 
^@^@ 

您的計算機存儲從最低有效字節開始的數據。前四列代表您的int;接下來的三個是char[3]。最後,在struct之間有1個字節的填充。

1

每個^@代表一個二進制0x00,例如^A代表0x01,^B代表0x02等等。看看你發佈的十六進制轉儲。由於您的平臺上的sizeof(int)爲4,因此每個example_array[i].x都會找到4個字節,然後是3個字節,其中包含字符串y。你會看到,你的第一個x被寫爲00 00 00 00,你的第二個x01 00 00 00,這就是你的系統中存儲的整數。如果你想把值寫成字符串,例如有一個平臺獨立的輸出文件,你可以使用像

fprintf(fp, "%d %s ", example_array[i].x, example_array[i].y)