欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 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);

}