C语言写入文本文件结果不符,切换二进制模式也无变化?求解析
C语言文本/二进制文件写入异常的原因解析
核心问题拆解
你遇到的问题来自三个关键点:fwrite的使用逻辑、hexdump的默认输出格式,以及文本/二进制模式的适用场景。
1. 为什么cat显示a90?
你用fwrite直接将变量的二进制内存数据写入文件,而非它们的字符串表示:
- 字符
'a'的ASCII码是0x61,写入文件后就是可打印的字符a。 - 整数
12345的十六进制值是0x3039(十进制12345 = 0x30×256 + 0x39),在小端字节序的系统中,4字节int的存储顺序是0x39、0x30、0x00、0x00:0x39对应ASCII字符'9',0x30对应'0'- 后面两个
0x00是ASCII空字符,cat会忽略不可见字符,最终显示a90。
2. hexdump输出的误解
hexdump默认以16位(2字节)为一组显示,且每组内的字节顺序是倒转的:
- 文件实际字节序列:
0x61('a')、0x39('9')、0x30('0')、0x00、0x00 - 第一组两个字节
0x61 0x39被倒转显示为3961 - 第二组两个字节
0x30 0x00被倒转显示为0030 - 最后一个字节
0x00补0后显示为0000
你误以为第一个字节是0x39,实际第一个字节是0x61,对应'a'的ASCII码。
3. 文本/二进制模式为什么没区别?
文本模式和二进制模式的差异仅存在于Windows系统:文本模式会自动将换行符\n转换为\r\n,二进制模式保留原始字节。而在Linux/Unix类系统中,两种模式完全等价,所以修改为wb后结果无变化。
如何正确写入数值的字符串形式?
如果想将整数12345以可读的字符串形式写入文件,不要用fwrite写二进制数据,改用fprintf:
#include <stdio.h> int main() { FILE *ptr_myfile; char c = 'a'; int numero = 12345; ptr_myfile = fopen("test.txt","w"); if (!ptr_myfile){ printf("Unable to open file!"); return 1; } fputc(c, ptr_myfile); // 写入字符'a' fprintf(ptr_myfile, "%d", numero); // 写入整数的字符串形式"12345" fclose(ptr_myfile); return 0; }
此时cat test.txt会显示a12345,hexdump输出也会对应61 31 32 33 34 35这些ASCII字节。
内容的提问来源于stack exchange,提问作者AndresG
相关产品推荐
相关产品推荐

