结构体,文件操作,指针,简单练习

#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);
    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;
    }

}

//根据学生分数排序
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);

}

 

posted on 2013-06-12 12:27  Jw.snow  阅读(275)  评论(0编辑  收藏  举报

导航