我有一个奇怪的结果做一个简单的开放和写作。我将引用这个程序,然后我将解释我的结果:
#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预期的十倍.但是在hello.txt文件中我得到了这样的信息:
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬
效汬潷汲䠀汥潬眠牯摬(1)为何会出现这种情况?我做错什么了?为什么是中国人?提前感谢
编辑:使用带有-Wall标志的gcc 4.8.1编译:没有警告
发布于 2014-04-01 22:17:25
您正在编写13字符(sizeof(buf),其中包括终止0 )。
因为您正在向您的终端发送文字0,所以它可能假定您的文本是“二进制”(至少,这就是OS的终端警告我的内容),因此它试图将文本转换为可能的编码: Unicode 16位。这是“可能的”,因为在拉丁文中,许多字符的16位代码中有0。
如果您检查这些汉字的Unicode值,您会发现
效 = U+6548
汬 = U+6C6C
潷 = U+6F77
汲 = U+6C72似乎包含了你想要的8位字符的十六进制代码。我怀疑这个列表中缺少空格U+0020,因为您的终端拒绝显示“无效”Unicode字符。
忘记添加明显的解决方案:少写一个字符。或者,更明显的是,写出strlen(buf)字符。
https://stackoverflow.com/questions/22797824
复制相似问题