C语言中写入结构体至文件出现乱码问题求助
结构体写入文件出现乱码的原因与解决办法
问题原因
你当前用fwrite直接把结构体的二进制内存数据写入文件,这不是给人可读的文本格式,乱码是正常现象:
- 数值类型(如
float Price、int Quantity)是按二进制编码存储的,不是字符形式,文本编辑器会把这些二进制字节解析成随机的ASCII字符(比如4.5的二进制表示对应Ù$@)。 - 字符串数组(如
ProId[20]、ProName[30])的未填充空间会保留随机内存值,写入文件后也会显示为乱码字符。
解决办法
根据你的需求选择对应方案:
方案1:保留二进制存储(适合程序间数据交换,读写效率高)
二进制存储的文件本来就不是给人工查看的,用fread读回结构体就能正常解析。注意打开文件时要使用二进制模式(避免Windows下换行符转换破坏数据):
#include <stdio.h> #include <string.h> struct Product { char ProId[20]; char ProName[30]; float Price; int Quantity; int CatId; }; int main(){ FILE *f; // 用二进制模式打开文件 f = fopen ("Product.dat", "rb+"); if (f == NULL) { fprintf(stderr, "\nError opened file\n"); return 1; // 出错直接退出,避免后续无效操作 } Product p1; strcpy(p1.ProId, "1"); strcpy(p1.ProName, "Candy"); p1.Price = 4.5; p1.Quantity = 5; p1.CatId = 1; fwrite(&p1, sizeof(p1), 1, f); fseek(f, 0, SEEK_SET); // 移动文件指针到开头 Product p2; fread(&p2, sizeof(p2), 1, f); // 读回结构体数据 // 验证读取结果 printf("ProId: %s\nProName: %s\nPrice: %.1f\nQuantity: %d\nCatId: %d\n", p2.ProId, p2.ProName, p2.Price, p2.Quantity, p2.CatId); fclose(f); return 0; }
方案2:写入可读文本格式(适合人工查看)
改用fprintf将每个字段按文本格式写入,用分隔符(如逗号)区分字段:
#include <stdio.h> #include <string.h> struct Product { char ProId[20]; char ProName[30]; float Price; int Quantity; int CatId; }; int main(){ FILE *f; f = fopen ("Product.txt", "w+"); if (f == NULL) { fprintf(stderr, "\nError opened file\n"); return 1; } Product p1; strcpy(p1.ProId, "1"); strcpy(p1.ProName, "Candy"); p1.Price = 4.5; p1.Quantity = 5; p1.CatId = 1; // 按文本格式写入,逗号分隔字段 fprintf(f, "%s,%s,%.1f,%d,%d\n", p1.ProId, p1.ProName, p1.Price, p1.Quantity, p1.CatId); fclose(f); // 读回文本数据验证 f = fopen("Product.txt", "r"); Product p2; // 用fscanf按分隔符读取 fscanf(f, "%[^,],%[^,],%f,%d,%d", p2.ProId, p2.ProName, &p2.Price, &p2.Quantity, &p2.CatId); printf("ProId: %s\nProName: %s\nPrice: %.1f\nQuantity: %d\nCatId: %d\n", p2.ProId, p2.ProName, p2.Price, p2.Quantity, p2.CatId); fclose(f); return 0; }
执行后文件内容为1,Candy,4.5,5,1,完全可读。
内容的提问来源于stack exchange,提问作者Universe Galaxy
相关产品推荐
相关产品推荐

