2011-10-22 49 views
1

我正在使用fwrite寫入類型爲uint8_t的數組。在終端中,在運行程序後,當我使用使用uint8_t數組進行fwrite

cat file.txt 

所有東西都打印出來,因爲它應該是。 但是當我打開與

vim file.txt 

我得到了一堆jibberish的超級失衡文件,主要

^@^@^@^@^@^@... 

VIM高repitition文件還在的底部指出[noeol]打開窗口

問題的上下文:udp客戶端/服務器文件複製程序。我需要原始文件與我的新文件進行比較;它沒有。

uint8_t buf[...]; 
recvfrom(...buf...); 
fwrite(buf...); 

原始文件有〜150個字符,亂碼文件有~30K個字符。

我將不勝感激任何回答或方向
-austin

+2

發佈一些代碼,什麼是在數組中。很可能你正在編寫一個二進制數據,並希望它看起來像文本一樣神奇。 – littleadv

+0

謝謝!那裏,我添加了一些代碼。即時通訊將嘗試將uint8轉換爲字符。或無符號的字符? – austin

+0

可能你並沒有檢查你是否真的收到了你所要求的。 –

回答

1

當vim在文件中遇到一個不可打印的字符時,它使用轉義碼來表示它。 ^@轉義碼用於表示空字符(即C中的)。這個角色是不可打印的,控制檯在你做cat file.txt時丟棄它。

所以我認爲你的代碼傳遞了一個不正確的大小到fwrite調用。傳遞緩衝區的大小而不是接收數據的大小?

您的代碼應該讀一些類似(適當的錯誤檢查):

uint32_t datalen; 
uint8_t buffer[BUFSIZE]; 
datalen = recvfrom(s, buffer, BUFSIZE, flags, &from, &from_len); 
fwrite(buffer, 1, datalen, f); 
+0

聖潔的廢話。天賜良機。 Sylvian Defresne是一位老闆。我的確在用緩衝區大小的靜態長度來寫,並沒有意識到recvfrom實際上會返回我需要的數字。謝謝你的提升。整個程序令人驚歎 – austin