文件写入结构体输出再排序

img

二进制写文件函数使用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;
    
} 

img