2014-04-01 40 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)个字符。

相关问题