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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:57:20