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

使用C语言fwrite写入结构体到TXT文件出现乱码,求解决方案

问题分析与解决:结构体写入TXT出现乱码

核心原因

乱码和VS Code、Mac OS无关,fwrite是二进制写入函数,它会把结构体在内存中的原始字节(包括数值类型的二进制编码、结构体的内存对齐填充字节)直接写入文件。文本编辑器会将这些字节当作可打印字符解析,而数值类型(比如gaji)的二进制字节大多不是ASCII可打印字符,因此显示为乱码。

解决方案

根据你需要TXT文件整齐显示、终端正常展示的需求,推荐以下两种方式:

1. 改用文本格式化写入(优先选择)

放弃fwrite,用fprintf将结构体的每个字段按文本格式写入,这样文件内容就是纯可打印文本,编辑器和终端都能正常查看:

// 替换原fwrite代码
fprintf(fp, "%s %s %llu %s\n", 
        new_dosen.dsn.nama, 
        new_dosen.dsn.nim, 
        new_dosen.gaji, 
        new_dosen.matkul);

如果需要方便后续程序读取,可以用分隔符(比如|)分隔字段:

fprintf(fp, "%s|%s|%llu|%s\n", 
        new_dosen.dsn.nama, 
        new_dosen.dsn.nim, 
        new_dosen.gaji, 
        new_dosen.matkul);

2. 保留二进制写入(仅用于程序间数据交换)

如果只是需要存储数据供程序后续读取,不需要人工查看,fwrite是可行的,但要注意:

  • 打开文件时明确指定二进制模式(跨平台更规范):
    FILE *fp = fopen("Dosen_kampus1.txt", "ab"); // 追加二进制模式
    
  • 读取时必须用fread对应结构体,再打印到终端查看:
    dosen temp_dosen;
    FILE *fp = fopen("Dosen_kampus1.txt", "rb");
    if (fp == NULL) {
        puts("文件打开失败");
        return;
    }
    while (fread(&temp_dosen, sizeof(dosen), 1, fp) == 1) {
        printf("Nama: %s, NIM: %s, Gaji: Rp%llu, Matkul: %s\n",
               temp_dosen.dsn.nama,
               temp_dosen.dsn.nim,
               temp_dosen.gaji,
               temp_dosen.matkul);
    }
    fclose(fp);
    
    这种方式下,文本编辑器查看文件依然会是乱码,但程序读取后可以正常解析。

代码里的额外问题

  • fflush(stdin)是C标准未定义的行为,建议用getchar()吃掉输入缓冲区的换行符:
    // 替换fflush(stdin)
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    
  • scanf("%[^\n]s"多了一个s,正确写法是scanf("%[^\n]", nama),否则会要求输入末尾必须有s字符,导致输入错误。

内容的提问来源于stack exchange,提问作者fyz 08

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:50:31