tugouzhishen 2022-09-01 10:11 采纳率: 88.5%
浏览 82
已结题

读取二进制文件并保存到文本文件C语言

我想要达到的结果

文件中有若干条以下列结构体形式保存的数据,把它们全部读取出来,并以文字形式保存到文本文件中(所有字符串都是ASCII字符,不考虑UTF8格式)。
typedef struct _st_record {
char szName[60];
char nGender; /* 0--male, 1--female */
unsigned char nAge;
short nBirthYear;
char szDescription[150];
} RRECORD;

  • 写回答

3条回答 默认 最新

  • qfl_sdu 2022-09-01 11:40
    关注

    因为手头没有二进制的文件,所以在下面的代码中,我单独封装了一个2个函数createData()和writeBitFile(),分别用来生成示例数据并将示例数据写入二进制文件。然后又定义了一个readFile()函数来读取二进制文件,然后用writeFile()函数来将读取的结构体写入文本文件。如果你已经有了二进制文件,可以将main函数中的createData()和writeBitFile()这两个函数注释掉。
    运行结果如下:

    img

    代码:

    
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #define MAXLEN 1000
    
    typedef struct _st_record {
        char szName[60];
        char nGender; /* 0--male, 1--female */
        unsigned char nAge;
        short nBirthYear;
        char szDescription[150];
    } RRECORD;
    
    
    
    
    //读取二进制文件
    void readFile(const char* filename, RRECORD max[], int* nmb)
    {
        int n = 0;
        FILE* fp = fopen(filename,"rb"); //读取二进制文件
        if (fp == 0)
        {
            printf("%s打开失败!\n");
            return;
        }
        //读取文件
        while (!feof(fp))
        {
            memset(&max[n], 0, sizeof(RRECORD));
            if (fread(&max[n], sizeof(RRECORD), 1, fp))
                n++;
        }
        *nmb = n;
        fclose(fp);
    }
    
    //写文本文件
    void writeFile(const char* filename, RRECORD max[], int nmb)
    {
        int i;
        char buf[100] = { 0 };
        FILE* fp = fopen(filename,"w");
        for (i = 0; i < nmb; i++)
        {
            sprintf(buf, "Name:%s\n", max[i].szName);
            fwrite(buf, 1, strlen(buf), fp);
            if (max[i].nGender == 0)
                sprintf(buf, "Gender:male\n");
            else
                sprintf(buf, "Gender:femal\n");
            fwrite(buf, 1, strlen(buf), fp);
            sprintf(buf, "Age:%d\n", max[i].nAge);
            fwrite(buf, 1, strlen(buf), fp);
            sprintf(buf, "BirthYear:%d\n", max[i].nBirthYear);
            fwrite(buf, 1, strlen(buf), fp);
            sprintf(buf, "Description:%s\n", max[i].szDescription);
            fwrite(buf, 1, strlen(buf), fp);
        }
        fclose(fp);
    }
    
    
    //写二进制文件
    void writeBitFile(const char* filename, RRECORD max[], int nmb)
    {
        int i;
        char buf[100] = { 0 };
        FILE* fp = fopen(filename, "wb");
        for (i = 0; i < nmb; i++)
        {
            fwrite(&max[i], sizeof(RRECORD), 1, fp);
        }
        fclose(fp);
    }
    
    //生成3个数据
    void createData(RRECORD max[])
    {
        strcpy(max[0].szName, "Zhang San");
        strcpy(max[0].szDescription, "aaaaaa");
        max[0].nAge = 22;
        max[0].nBirthYear = 2000;
        max[0].nGender = 0;
    
        strcpy(max[1].szName, "Li Si");
        strcpy(max[1].szDescription, "bbb");
        max[1].nAge = 33;
        max[1].nBirthYear = 1980;
        max[1].nGender = 1;
    
        strcpy(max[2].szName, "Wang Wu");
        strcpy(max[2].szDescription, "ccc");
        max[2].nAge = 22;
        max[2].nBirthYear = 2000;
        max[2].nGender = 0;
    
    }
    
    int main( RRECORD max[], int* nmb)
    {
        RRECORD arr[MAXLEN],test[10];
        int n = 0;
    
        //模拟数据并生成二进制文件,这里只是为了生成二进制文件,如果已有二进制文件,这两行忽略
        createData(test);
        writeBitFile("a.txt", test, 3);
    
        //读二进制文件
        readFile("a.txt", arr, &n);
    
        //将数据写入文本文件
        if(n>0)
            writeFile("b.txt", arr, n);
    
        return 0;
    
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 9月9日
  • 已采纳回答 9月1日
  • 创建了问题 9月1日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同