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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:50:41