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.关闭写指针

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

#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;
}

文件操作可以看我这篇博客https://blog.csdn.net/weixin_64811333/article/details/125249190

#include <stdio.h>

#define INPUT_FILE_ERROR 1
#define OUTPUT_FILE_ERROR 2

typedef struct _st_record {
  char szName[60];
  char nGender; /* 0--male, 1--female */
  unsigned char nAge;
  short nBirthYear;
  char szDescription[150];
} RRECORD;

int main() {
  FILE *in_file = fopen("data.dat", "rb");
  if (!in_file) {
    perror("failed to open data.dat");
    return INPUT_FILE_ERROR;
  }

  FILE *out_file = fopen("data.txt", "w");
  if (!out_file) {
    perror("failed to open data.txt");
    fclose(in_file);
    return OUTPUT_FILE_ERROR;
  }

  RRECORD r;
  while (fread(&r, sizeof(RRECORD), 1, in_file) == 1) {
    fprintf(out_file, "%s, %d, %d, %d, %s\n", r.szName, r.nGender, r.nAge,
            r.nBirthYear, r.szDescription);
  }

  fclose(in_file);
  fclose(out_file);

  return 0;
}

rb
wb