二进制写文件函数使用fwrite,二进制读文件函数使用fread即可,一个初步的实现如下,供参考:
#include <stdio.h>
#include <string.h>
// 学生信息结构
typedef struct studentMessage{
char name[20];
char address[30];
char phone[12];
}stuMsg;
int main(void){
// 利用fwrite()函数以二进制形式写入学生信息 ,作为原始文件class.dat
stuMsg ss[3]={{"Andy","Tokyo","13838388388"},{"Lucy","London","13999939399"},{"Cathy","Paris","13000030300"}};
FILE * fp = fopen("class.dat","wb");
int i;
for(i=0;i<3;i++){
fwrite(ss[i].name,sizeof(char),20,fp); //按照学生信息结构的name字段长度写入文件,以便后面以同样的长度来读取
fwrite(ss[i].address,sizeof(char),30,fp); // 同样按address字段长度写入
fwrite(ss[i].phone,sizeof(char),12,fp); // 同样按phone字段长度写入
}
fclose(fp);
// 读取原始文件class.dat的内容,并打印
fp = fopen("class.dat","rb");
stuMsg ssRead [3];
printf("原文件的内容:\n");
for(i=0;i<3;i++){
fread(ssRead[i].name,sizeof(char),20,fp);
fread(ssRead[i].address,sizeof(char),30,fp);
fread(ssRead[i].phone,sizeof(char),12,fp);
printf("%s %s %s\n",ssRead[i].name,ssRead[i].address,ssRead[i].phone);
}
fclose(fp);
int j;
stuMsg temp;
printf("\n排序后的结果:\n");
// 按学生名字以字典顺序从大到小排序
for(i=0;i<3;i++){
for(j=i;j<3;j++){
if(strcmp(ssRead[i].name,ssRead[j].name)<0){
temp = ssRead[i];
ssRead[i] = ssRead[j];
ssRead[j] = temp;
}
}
}
for(i=0;i<3;i++){
printf("%s %s %s\n",ssRead[i].name,ssRead[i].address,ssRead[i].phone);
}
fp = fopen("classOut.dat","wb");
// 以二进制形式写入原始文件class.dat的内容
for(i=0;i<3;i++){
fwrite(ss[i].name,sizeof(char),20,fp);
fwrite(ss[i].address,sizeof(char),30,fp);
fwrite(ss[i].phone,sizeof(char),12,fp);
// 每个学生记录后面看是否需要以二进制形式写入一个换行字符
}
// 因为不知道怎么在二进制文件中输入一个空行,所以用字符串"2333"的来代替
char middle='\n';
fwrite(&middle,sizeof(char),1,fp); // 以二进制形式写入一个换行字符
// 以二进制形式写入排序后的学生结构数组信息
for(i=0;i<3;i++){
fwrite(ssRead[i].name,sizeof(char),20,fp);
fwrite(ssRead[i].address,sizeof(char),30,fp);
fwrite(ssRead[i].phone,sizeof(char),12,fp);
// 每个学生记录后面看是否需要以二进制形式写入一个换行字符
}
fclose(fp);
stuMsg result[6];
char middleTemp;
fp=fopen("classOut.dat","rb");
// 再次读取写入结果的文件内容,以验证写入是否正确
printf("\n写入的结果如下:\n");
for(i=0;i<6;i++){
if(i==3){
fread(&middleTemp,sizeof(char),1,fp);
printf("%c",middleTemp);
}
fread(result[i].name,sizeof(char),20,fp);
fread(result[i].address,sizeof(char),30,fp);
fread(result[i].phone,sizeof(char),12,fp);
printf("%s %s %s\n",result[i].name,result[i].address,result[i].phone);
}
fclose(fp);
return 0;
}