write会在文件中产生奇怪的结果

时间:2014-04-01 22:05:25

标签: c file-io

我做了一个简单的开放和写作的奇怪结果。我引用该程序,然后我将解释我的结果:

#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进行编译:无警告

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)个字符。