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

因为手头没有二进制的文件,所以在下面的代码中,我单独封装了一个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;

}

那你现在的文件是啥格式的啊???
用fopen打开文件读取解析,在fprintf写入新文件