我做了一个简单的开放和写作的奇怪结果。我引用该程序,然后我将解释我的结果:
#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 world的10倍......但是在文件hello.txt上我得到了这个:
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬
1)为什么会这样?我做错了什么?为什么是中国人? 提前致谢
编辑:使用带有-Wall标志的gcc 4.8.1进行编译:无警告
答案 0 :(得分:2)
您正在撰写 13 个字符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)
个字符。