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

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 wamp3.3.5安装完成后图标正常显示绿色,鼠标左右键点击图标均无反应。求解决方法。
  • ¥15 鼠标点击的这条记录了什么?
  • ¥15 在写pid调速的程序时,电机始终维持最大速度
  • ¥15 请问如何查看手机root记录?
  • ¥15 商城小程序订单号重复
  • ¥15 学校优化算法sbo和蚁群算法怎么结合
  • ¥21 matlab怎么求时域信号的二阶导数
  • ¥15 判断两个表是否完全相同
  • ¥15 java map类型数据格式,如何快速通过前缀匹配元素
  • ¥15 stc12c5a60s2、QMC5883L、LCD1602组合测量磁场所需程序