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

读取二进制文件并保存到文本文件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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装