You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:27:49