结构体,文件操作,指针,简单练习
程序员文章站
2022-04-30 19:34:43
...
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #define SCORES 5 #define S 3 typedef struct { int num; char *name; char sex[2]; float score[SCORES]; float total; } STU; //输入n个学生的信息 void initInfo(STU * st,int n); //保存n个学生文件 void saveAsFile(STU * st,int n); //根据4门功课分数排序 void sortByScore(STU * st,int n); //读取文件 void readFile(STU * st,int n); int main(){ STU ps[S]; initInfo(ps,S); sortByScore(ps,S); saveAsFile(ps,S); readFile(ps,S); //释放name //int i; //for(i=0;i<S;i++) // free((ps+i)->name); return 0; } void initInfo(STU * p,int n){ int i,j; for(i=0;i<n;i++){ char tmp[10]; int len; printf("\n---- 请输入第%d个学生的信息-------",i+1); printf("\n请输入编号:"); if((scanf("%d",&((p+i)->num)))!=1) return; printf("\n请输入姓名:"); if(scanf("%s",tmp)==1){ len=strlen(tmp); (p+i)->name=(char *)malloc(len+1); strcpy((p+i)->name,tmp); }else{ return; } printf("\n请输入性别:"); if(scanf("%s",(p+i)->sex)!=1) { free((p+i)->name);//函数return终止释放name return; } printf("\n请输入5门功课分数:\n"); //memset((p+i)->score,0,sizeof(int)*SCORES); for(j=0;j<SCORES;j++){ if(scanf("%f",(p+i)->score+j)!=1){ break; }else{ (p+i)->total+=(p+i)->score[j]; } } //对于未输入的赋值0 for(;j<SCORES;j++) (p+i)->score[j]=0; //释放name //free((p+i)->name); } } //根据学生分数排序 void sortByScore(STU * pst, int n){ int i,j; STU st; for(i=0;i<n;i++){ for(j=0;j<n-i-1;j++){ if((pst+j)->total>(pst+j+1)->total){ st=*(pst+j); *(pst+j)=*(pst+j+1); *(pst+j+1)=st; } } } } //保存n个学生的信息至students文件 void saveAsFile(STU * pst,int n){ FILE *f; int i; if((f=fopen("students","wb"))==NULL){ printf("cannt opent file."); exit(0); } printf("-----------开始写入文件-----------------\n"); for(i=0;i<n;i++) if(fwrite(pst+i,sizeof(STU),1,f)!=1) printf("file write error"); printf("-----------写入文件成功-----------------\n"); fclose(f); } //从students文件读取信息并打印 void readFile(STU * pst,int n){ int i,j; FILE *f; if((f=fopen("students","rb"))==NULL){ printf("cannt opent file."); exit(0); } printf("-----------开始读取文件-----------------\n"); for(i=0;i<n;i++){ fread(pst+i,sizeof(STU),1,f); printf("%4d %5s %2s",(pst+i)->num,(pst+i)->name,(pst+i)->sex); for(j=0;j<SCORES;j++) printf(" %3.1f ",(pst+i)->score[j]); printf(" %4.1f ",(pst+i)->total); printf("\n"); } printf("-----------读取文件结束-----------------\n"); fclose(f); }
上一篇: C++中的结构体(C++入门)
下一篇: nginx学习笔记(三)一些小功能