2014-04-01 77 views
0

我有一個簡單的打開和寫入奇怪的結果。我會引用該程序,然後我會解釋我的結果:寫在文件中產生奇怪的結果

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main(){ 
    int fd = open("hello.txt", O_WRONLY|O_CREAT, 0700); 
char buf[] = "Hello world\n"; 
int i=0; 
for(i = 0; i < 10;i++){ 
    write(1,buf,sizeof(buf)); 
    write(fd, buf, sizeof(buf)); 
} 
close(fd); 
return 0; 
} 

使用此代碼,在終端輸出將是世界,你好十倍預期......但在文件hello.txt的我得到這個:

效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 
效汬潷汲੤䠀汥潬眠牯摬 

1)爲什麼會發生這種情況?我做錯了什麼?爲什麼是中國人? 在此先感謝

編輯:使用gcc 4.8.1與-Wall標誌進行編譯:沒有警告

+0

我編譯並運行它時沒有遇到這個錯誤。 – squiguy

+0

適合我。你可能想檢查你的終端設置。 – Asblarf

+0

你打電話給'open'後檢查過fd!= -1嗎? –

回答

2

你正在寫字符(sizeof(buf),其中包括終止0

因爲你是。發送文字0到您的終端,它可能假設您的文本是'二進制'(至少,這是OS X的終端警告我),因此它試圖將文本轉換爲可能編碼:Unicode 16位這是'可能的',因爲在拉丁文中使用,很多字符在它們的16位代碼中都有0。

如果您檢查這些中國漢字的Unicode值,你會發現

效 = U+6548 
汬 = U+6C6C 
潷 = U+6F77 
汲 = U+6C72 

這似乎包含你要的8位字符的十六進制代碼。我懷疑此列表中缺少空間U+0020,因爲您的終端拒絕顯示「無效的」Unicode字符。


忘了添加明顯的解決辦法:少寫一個字符。或者,更明顯的是,寫出strlen(buf)個字符。

相關問題