使用fprintf写入文件时输出两个值而非预期单个值的问题
问题拆解与解决办法
嘿,我来帮你理清楚为什么会出现这种情况,以及怎么解决它。你遇到的问题其实是两个点叠加导致的:
1. 为什么文件里会出现0x0D+0x0A?
首先,你用"w"模式打开文件,这是文本模式。在Windows系统中,标准库的文本模式会自动把换行符\n(也就是ASCII 10,对应0x0A)转换成\r\n(0x0D+0x0A)——这是Windows文本文件的标准换行格式,和Unix/Linux的纯\n不一样。
其次,你的fprintf调用有个严重的错误:%s格式符是用来输出字符串的,它要求传入一个char*指针,指向以\0结尾的字符数组,但你传的是unsigned int数组hex的地址。这会让程序把hex所在的内存区域当成字符串来读,直到碰到\0字节为止。你的hex数组里只有一个元素10(0x0A),后面的内存内容不确定,但刚好这个0x0A被当成了字符串里的\n,然后被文本模式转换成了\r\n,所以你看到了0x0D和0x0A这两个字节。
2. 怎么正确写入单个字节0x0A?
要解决这个问题,得从两个方面修正:
- 用二进制模式打开文件,避免文本模式的自动转换,打开时用
"wb"而不是"w"; - 用适合二进制写入的函数,别再用
fprintf(它是给文本格式化输出用的),换成fwrite或者fputc更靠谱。
修正后的代码示例
方法一:用fwrite写入二进制数据
#include <stdio.h> int main() { FILE *fp; unsigned char target_byte = 0x0A; // 用单字节类型更准确,避免多余内存 fp = fopen("file.txt", "wb"); // 二进制模式打开文件 if (fp != NULL) { // 一定要检查文件是否成功打开,避免空指针错误 fwrite(&target_byte, sizeof(target_byte), 1, fp); // 写入1个字节 fclose(fp); } return 0; }
方法二:用fputc写入单个字符(字节)
#include <stdio.h> int main() { FILE *fp; fp = fopen("file.txt", "wb"); if (fp != NULL) { fputc(0x0A, fp); // 直接写入单个字节对应的字符 fclose(fp); } return 0; }
额外小提示
如果你非要用fprintf(其实不推荐,因为它是文本工具),也可以这么改:打开二进制模式,然后用%c格式符输出单个字符:
fprintf(fp, "%c", 0x0A);
但还是建议用fwrite或者fputc,处理二进制数据逻辑更清晰,不容易踩坑。另外,你原代码里用unsigned int数组存单个10,其实每个元素占4字节(通常情况),内存里是0x0000000A,fprintf用%s读的时候会把第一个字节0x0A当字符,直到后面的0x00才停止,这也是潜在的未定义行为,换成单字节类型更合理。
内容的提问来源于stack exchange,提问作者tem887
相关产品推荐
相关产品推荐

