`
Jw.mac
  • 浏览: 10454 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

    博客分类:
  • c
阅读更多
#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);

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics