使用write函数向文件写入整数变量遇问题求助
解决文件写入整数乱码/无法显示的问题
嘿,我来帮你捋捋这个困扰你的问题!
为啥直接写整数会出问题?
你用write()直接写整数变量的时候,它是把整数的二进制原始字节怼进文件里的,不是咱们能看懂的文本字符。举个例子,整数123在内存里是4字节的二进制(比如0x0000007B),文本编辑器打开时会把这些字节当成ASCII码解析,可不就显示乱码或者提示无法显示嘛!
用了sprintf还是不行?大概率是细节没做对
如果转成字符串还是乱码,基本逃不开这两个坑:
- 没处理好字符串终止符:
sprintf()生成的字符串是以\0结尾的,但要是你写入的时候把这个终止符也写进去,或者没算准有效字符的长度,就会出问题; - write的长度参数错了:
write()需要明确指定写入的字节数,要是你传了sizeof(int)或者sizeof(buf),就会把缓冲区里多余的垃圾内容也写进去,自然就乱码了。
两种靠谱的解决办法
方法1:用文本写入函数(简单省心)
如果只是要写人类能读的整数,直接用fprintf()这种文本模式的函数最省事,不用自己折腾转码:
#include <stdio.h> int main() { int num = 123; FILE *fp = fopen("data.txt", "w"); if (fp != NULL) { fprintf(fp, "%d", num); // 直接以文本格式写入整数 fclose(fp); } return 0; }
方法2:sprintf+write的正确打开方式
要是你必须用write()(比如Linux系统调用场景),一定要注意只写入字符串的有效长度:
#include <stdio.h> #include <unistd.h> #include <fcntl.h> int main() { int num = 123; char buf[20]; // 把整数转成字符串,返回的是有效字符的长度(不含终止符\0) int str_len = sprintf(buf, "%d", num); int fd = open("data.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644); if (fd != -1) { write(fd, buf, str_len); // 只写有效字符,别瞎传sizeof(buf) close(fd); } return 0; }
额外小提示
- 之前那个无法显示的文件其实是二进制文件,你可以用
hexdump data.txt命令查看它的原始字节,就能看到整数的二进制存储形式啦; - 创建文件时记得设置合理的权限,比如
0644,确保文件能正常被读取。
内容的提问来源于stack exchange,提问作者Anas M K
相关产品推荐
相关产品推荐

