首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入会在文件中产生奇怪的结果。

写入会在文件中产生奇怪的结果。
EN

Stack Overflow用户
提问于 2014-04-01 22:05:25
回答 1查看 62关注 0票数 0

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

代码语言:javascript
运行
复制
#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文件中我得到了这样的信息:

代码语言:javascript
运行
复制
效汬潷汲੤䠀汥潬眠牯摬
效汬潷汲੤䠀汥潬眠牯摬
效汬潷汲੤䠀汥潬眠牯摬
效汬潷汲੤䠀汥潬眠牯摬
效汬潷汲੤䠀汥潬眠牯摬

(1)为何会出现这种情况?我做错什么了?为什么是中国人?提前感谢

编辑:使用带有-Wall标志的gcc 4.8.1编译:没有警告

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-01 22:17:25

您正在编写13字符(sizeof(buf),其中包括终止0 )。

因为您正在向您的终端发送文字0,所以它可能假定您的文本是“二进制”(至少,这就是OS的终端警告我的内容),因此它试图将文本转换为可能的编码: Unicode 16位。这是“可能的”,因为在拉丁文中,许多字符的16位代码中有0。

如果您检查这些汉字的Unicode值,您会发现

代码语言:javascript
运行
复制
效 = U+6548
汬 = U+6C6C
潷 = U+6F77
汲 = U+6C72

似乎包含了你想要的8位字符的十六进制代码。我怀疑这个列表中缺少空格U+0020,因为您的终端拒绝显示“无效”Unicode字符。

忘记添加明显的解决方案:少写一个字符。或者,更明显的是,写出strlen(buf)字符。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22797824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档