因为手头没有二进制的文件,所以在下面的代码中,我单独封装了一个2个函数createData()和writeBitFile(),分别用来生成示例数据并将示例数据写入二进制文件。然后又定义了一个readFile()函数来读取二进制文件,然后用writeFile()函数来将读取的结构体写入文本文件。如果你已经有了二进制文件,可以将main函数中的createData()和writeBitFile()这两个函数注释掉。
运行结果如下:
代码:
#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;
}