tugouzhishen 2022-09-07 12:33 采纳率: 88.5%
浏览 98
已结题

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;

我想要达到的结果

//声明计数用变量
//声明读取用的文件指针
//声明写入用的文件指针
//1.读取data.dat, fpen, 读.
//2.创建写入用的文件指针 fopen .txt, 写
//3 while循环读取dat,直到读空
//3.1 每次读取一个结构体.放到结构体变量里 =>可以有子函数,但实际上一句话就够了。
//3.2 把结构体变量格式化成文本以后,写入txt文件里 =>可以有子函数
//4.关闭读指针
//5.关闭写指针

  • 写回答

5条回答 默认 最新

  • qfl_sdu 2022-09-07 15:21
    关注

    按照你的逻辑,代码如下:

    #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 writeFile(FILE* fp, RRECORD t)
    {
        char buf[100] = { 0 };
        sprintf(buf, "Name:%s\n", t.szName);
        fwrite(buf, 1, strlen(buf), fp);
        if (t.nGender == 0)
            sprintf(buf, "Gender:male\n");
        else
            sprintf(buf, "Gender:femal\n");
        fwrite(buf, 1, strlen(buf), fp);
        sprintf(buf, "Age:%d\n", t.nAge);
        fwrite(buf, 1, strlen(buf), fp);
        sprintf(buf, "BirthYear:%d\n", t.nBirthYear);
        fwrite(buf, 1, strlen(buf), fp);
        sprintf(buf, "Description:%s\n", t.szDescription);
        fwrite(buf, 1, strlen(buf), fp);
    }
    
    int main()
    {
        int n = 0;     //声明计数用的变量
        FILE* fr, *fw; //声明读取和写入的文件指针
        RRECORD arr[MAXLEN]; //保存数据
    
        //打开二进制文件
        fr = fopen("data.dat", "rb"); //读取二进制文件
        if (fr == 0)
        {
            printf("%s打开失败!\n");
            return 0;
        }
    
        //打开文本文件
        fw = fopen("out.txt", "w");
    
        //读取文件
        while (!feof(fr))
        {
            memset(&arr[n], 0, sizeof(RRECORD));
            if (fread(&arr[n], sizeof(RRECORD), 1, fr))  //逐个结构体读取
            {
                //将结构体写入文本文件
                writeFile(fw, arr[n]);
                n++; //读取的个数+1
            }
                
        }
       
        fclose(fr); //关闭读指针
        fclose(fw); //关闭写指针
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 MIMIC数据库安装问题
  • ¥15 c# 调用python报错Python.Runtime.PythonException:“No module named '_ctypes,如何解决?
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥60 为什么使用python对地震数据进行umap降维后,数据成图会出现不连续的现象
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题
  • ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接