使用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
相关产品推荐
相关产品推荐

