2014-10-02 66 views
0

我有一個C程序寫入使用fwrite(..)文件,並且結果與我提供的函數的參數不一致。fwrite不應該像它應該

uint32_t x = 1009716161; 
    FILE * file = fopen("helloop.txt", "wb+"); 
    rewind(file); 
    fwrite(&x, sizeof(uint32_t), 1, file); 
    fclose(file); 

當我後來檢查文件似乎包含沒有轉化成任何

>cat helloop.txt 
>Á/< 

,我應該得到這個

>cat helloop.txt 
>000000003C2F0BC1 

我檢查了文件的權限符號和我修改它

chmod 777 helloop.txt 

我看到它的方式我有一個大小爲32位整數的元素,我想寫入文件, 我做錯了什麼?

+2

該文件的權限是不相關的。將權限設置爲777是沒有意義的。除非實際需要文件,否則文件不應具有執行許可權,並且系統上的每個用戶都可以寫入文件的情況很少有意義。 – 2014-10-02 03:00:26

回答

0

貓helloop.txt A/<

cat打印字符數據。它不會以32位整數的形式在文件中打印4字節的值。

,我應該得到這個

貓helloop.txt 000000003C2F0BC1

不,你不應該,不與cat。如果您希望獲得該信息,則必須將字符串「000000003C2F0BC1」寫入該文件。該文件可能是16個字符長。我現在打賭,如果你運行ls -l helloop.txt,你會看到尺寸4,因爲你爲文件寫了一個uint32_t二進制整數。

我做錯了什麼?

據我所知,你做錯的唯一的事情是期待cat打印出你的uint32_t作爲十六進制表示法。 (雖然我沒有檢查你的十六進制值,所以也可能不正確)

看看你的Linux機器上是否有hexdump,它可能會給你更好的結果。

編輯:如果你實際上要打印uint32_t的爲十六進制的字符串,可以使用fprintf(..., "%x", x)xX格式說明,但請記住,這是不是FWRITE/FREAD兼容,因此讀回在你必須讀取字符串並將其從十六進制轉換爲int。

+0

是的,我擁有它,它向我展示了正確的輸出。 – maxwell 2014-10-02 03:01:17

+0

你走了。 :)所以你的程序工作。你只是對'貓'有錯誤的期望 – codenheim 2014-10-02 03:02:16

2

您的程序完全按照您的要求進行了操作。一般而言,如果您編寫的程序似乎行事不端,則不應該跳到操作系統,編譯器或運行時庫存在錯誤的結論。您的程序中存在錯誤的可能性更大,或者您錯誤地理解了某些內容。不管你有多少年的經驗,這仍然是真實的。

值爲1009716161,以十六進制表示,爲0x3c2f0bc1。當您將該值寫入二進制文件時,可以寫入4個8位字節,值爲0x3c,0x2f,0x0b0xc1。在ASCII中,這些是'<','/',以及可打印的ASCII範圍之外的兩個字符。它們的寫入順序取決於系統的字節順序,但是您報告的內容看起來與此一致。

我不確定你爲什麼期望看到000000003C2F0BC1這是16字節,當你只寫了4個字節的文件,而且二進制文件不包含你寫的數據的十六進制表示的ASCII渲染 - 它們只包含數據

如果您從原始的二進制其轉換爲十六進制(使用,如果你的系統有它的hexdumpod -x命令)檢查該文件,你應該看到的東西識別

。如果以二進制模式打開文件並使用fread將數據讀回到uint32_t對象中,那麼您應該得到原始值1009716161回來 - 這是整個點。