【C/C++】文件操作實例——學生信息管理

 對C語言中文件操作函數的使用實例,曾經的一道作業題。

現在用Java比較多,回過頭才發現曾經學習的C已經忘卻了不少┭┮﹏┭┮

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100

typedef struct{
    long int sto;
    char stun[20];
    float goal[3];
    float aver;
    float sum;
    } STU;

void manu(){
	printf("***************************************************************************\n");
	printf("***                       學生信息管理菜單               		***\n");
	printf("***            1、錄入學生信息                 				***\n");
	printf("***            2、查詢學生信息                 				***\n");
	printf("***            3、添加學生信息                 				***\n");
	printf("***            4、學生信息排序                 				***\n");
	printf("***            5、插入學生信息                 				***\n");
	printf("***            6、修改學生信息                 				***\n");
	printf("***            7、刪除學生信息                 				***\n"); 
	printf("***            0、輸入0退出程序                 			***\n"); 
	printf("***************************************************************************\n");
} 

void insert(FILE *fp,STU s[]){
	//錄入數據 
	int num=0;
	printf("請依次輸入學號、用戶名、語數英三科成績:\n"); 
    if((fp=fopen("timu.dat","w"))==NULL){
        printf("cannot open the file!");
    }
	scanf("%ld%s%f%f%f",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
	fprintf(fp,"%ld  %s  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);	
    fclose(fp);
}

void secret(FILE *fp,STU s[]){
	int f;
	printf("請選擇查詢方式:\n");
	printf("1、按學號順序查詢\n");
	printf("2、查詢所有學生信息\n");
	scanf("%d",&f);
	switch(f){
		case 1:{
			long int stoo;
			printf("請輸入學號:");
			scanf("%ld",&stoo);
			int num=0;
			if((fp=fopen("timu.dat","r"))==NULL){
		        printf("cannot open the file!");
		    }
		    for(num;num<rows(fp);num++){
		    	fscanf(fp,"%ld  %s  %f  %f  %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
				s[num].aver=(s[num].goal[0]+s[num].goal[1]+s[num].goal[2])/3;
				s[num].sum=s[num].goal[0]+s[num].goal[1]+s[num].goal[2];	
		    	if(s[num].sto==stoo){
		    		printf("%ld  %s  %7.2f  %7.2f  %7.2f  %7.2f  %7.2f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    	}
		    }
		    fclose(fp);
			break;
		}
		case 2:{
			int num=0;
			if((fp=fopen("timu.dat","r"))==NULL){
		        printf("cannot open the file!");
		    }
		    for(num;num<rows(fp);num++){
		    	fscanf(fp,"%ld  %s  %f  %f  %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
				s[num].aver=(s[num].goal[0]+s[num].goal[1]+s[num].goal[2])/3;
				s[num].sum=s[num].goal[0]+s[num].goal[1]+s[num].goal[2];	
		    		printf("%ld  %s  %7.2f  %7.2f  %7.2f  %7.2f  %7.2f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    }
		    fclose(fp);
			break;
		}
		default: printf("輸入有錯\n");
	}
}

int add(FILE *fp,STU s[]){
	//添加信息 
	long int stoo;
	int num=0;
	char stunn[20];
	float goall[3];
    if((fp=fopen("timu.dat","a"))==NULL){
        printf("cannot open the file!");
        return 0; 
    }
	scanf("%ld%s%f%f%f",&stoo,stunn,&goall[0],&goall[1],&goall[2]);
    for(num;num<rows(fp);num++){
    	fscanf(fp,"%ld  %s  %f  %f  %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);	
    	if(stoo==s[num].sto){
    		printf("學號重複,不能重新錄入!\n");
    		return 0;
    	}
    }
	fprintf(fp,"%ld  %s  %f  %f  %f\n",stoo,stunn,goall[0],goall[1],goall[2]);
	printf("添加成功!\n");		
    fclose(fp);
}

int sort(FILE *fp,STU s[]){
	int num=0;
	if((fp=fopen("timu.dat","r"))==NULL){
        printf("cannot open the file!");
        return 0;    
    }
	for(num;num<rows(fp);num++){
    	fscanf(fp,"%ld  %s  %f  %f  %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
		s[num].aver=(s[num].goal[0]+s[num].goal[1]+s[num].goal[2])/3;
		s[num].sum=s[num].goal[0]+s[num].goal[1]+s[num].goal[2];
	//	printf("%f",s[num].aver);
	//	printf("%ld  %s  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
    } 
    STU tmp;
    int t,y;
      	
	int o;
	printf("請選擇排序方式:\n");
	printf("1、按學號順序排列;\n");
	printf("2、按語文成績排列;\n");
	printf("3、按數學成績排列;\n");
	printf("4、按英語成績排列;\n"); 
	printf("5、按平均成績排列;\n");
	printf("6、按總成績排列;\n");
	scanf("%d",&o);
	switch(o){
		case 1:{
			for(t=0;t<rows(fp)-1;t++){
		    	for(y=0;y<rows(fp)-t-1;y++){
		    		if(s[y+1].sto<s[y].sto){
		    			tmp=s[y];
		    			s[y]=s[y+1];
		    			s[y+1]=tmp;
		    		}
		    	}
		    }
		    for(num=0;num<rows(fp);num++){	
				printf("%ld  %s  %f  %f  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    }			
			break;
		}
		case 2:{
			for(t=0;t<rows(fp)-1;t++){
		    	for(y=0;y<rows(fp)-t-1;y++){
		    		if(s[y+1].goal[0]<s[y].goal[0]){
		    			tmp=s[y];
		    			s[y]=s[y+1];
		    			s[y+1]=tmp;
		    		}
		    	}
		    }
		    for(num=0;num<rows(fp);num++){	
				printf("%ld  %s  %f  %f  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    }						
			break;
		}
		case 3:{
			for(t=0;t<rows(fp)-1;t++){
		    	for(y=0;y<rows(fp)-t-1;y++){
		    		if(s[y+1].goal[1]<s[y].goal[1]){
		    			tmp=s[y];
		    			s[y]=s[y+1];
		    			s[y+1]=tmp;
		    		}
		    	}
		    }
		    for(num=0;num<rows(fp);num++){	
				printf("%ld  %s  %f  %f  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    }						
			break;
		}
		case 4:{
			for(t=0;t<rows(fp)-1;t++){
		    	for(y=0;y<rows(fp)-t-1;y++){
		    		if(s[y+1].goal[2]<s[y].goal[2]){
		    			tmp=s[y];
		    			s[y]=s[y+1];
		    			s[y+1]=tmp;
		    		}
		    	}
		    }
		    for(num=0;num<rows(fp);num++){	
				printf("%ld  %s  %f  %f  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    }						
			break;
		}
		case 5:{
			for(t=0;t<rows(fp)-1;t++){
		    	for(y=0;y<rows(fp)-t-1;y++){
		    		if(s[y+1].aver<s[y].aver){
		    			tmp=s[y];
		    			s[y]=s[y+1];
		    			s[y+1]=tmp;
		    		}
		    	}
		    }
		    for(num=0;num<rows(fp);num++){	
				printf("%ld  %s  %f  %f  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    }						
			break;
		}
		case 6:{
			for(t=0;t<rows(fp)-1;t++){
		    	for(y=0;y<rows(fp)-t-1;y++){
		    		if(s[y+1].sum<s[y].sum){
		    			tmp=s[y];
		    			s[y]=s[y+1];
		    			s[y+1]=tmp;
		    		}
		    	}
		    }
		    for(num=0;num<rows(fp);num++){	
				printf("%ld  %s  %f  %f  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2],s[num].aver,s[num].sum);
		    }						
			break;
		}
	} 
    //重新寫入
    fclose(fp);
    return 0;
}

int charu(FILE *fp,STU s[]){
	long int cha;
	int num,t,tmp; 
	printf("請輸入想要插入位置,在學號爲多少的學生前插入:\n");
	scanf("%d",&cha);
	if((fp=fopen("timu.dat","r"))==NULL){
        printf("cannot open the file!");
    }
    for(num=0;num<rows(fp);num++){
    	fscanf(fp,"%ld  %s  %f  %f  %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);	
    	printf("!!!!%ld  %s  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
    }
    fclose(fp);
    int just;
    for(num=0;num<rows(fp);num++){
    	if(s[num].sto==cha){
    		for(t=rows(fp);t>num;t--){
    			s[t]=s[t-1];
    			printf("@@@@@%ld  %s  %f  %f  %f\n",s[t].sto,s[t].stun,s[t].goal[0],s[t].goal[1],s[t].goal[2]);
    		}
    		printf("請輸入插入的學生信息:\n");
    		scanf("%ld %s %f %f %f",&s[t].sto,s[t].stun,&s[t].goal[0],&s[t].goal[1],&s[t].goal[2]);
    		
//    		for(num=0;num<rows(fp)+1;num++){
//		    	printf("%ld  %s  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
//		    }
		    tmp=rows(fp);
		    //printf("%d\n",tmp);
    		if((fp=fopen("timu.dat","w"))==NULL){
		        printf("cannot open the file!");
		    } 
		    for(num=0;num<tmp+1;num++){
		    //	printf("%ld  %s  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
		    	fprintf(fp,"%ld  %s  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
		    }
		    fclose(fp);
    		printf("插入成功!\n");
    		break;
    	}
    }	
    return 0;
}

int delet(FILE *fp,STU s[]){
	long int cha;
	int num,t,tmp; 
	printf("請輸入想要刪除的信息學號:\n");
	scanf("%d",&cha);
	if((fp=fopen("timu.dat","r"))==NULL){
        printf("cannot open the file!");
    }

    for(num=0;num<rows(fp);num++){
    	fscanf(fp,"%ld  %s  %f  %f  %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);	
    }
    fclose(fp);
    int just;
    for(num=0;num<rows(fp);num++){
    	if(s[num].sto==cha){
    		for(t=num;t<rows(fp);t++){
    			s[t]=s[t+1];
    		}
    		break;
    	}
    }
    tmp=rows(fp);
	if((fp=fopen("timu.dat","w"))==NULL){
        printf("cannot open the file!");
    } 
    for(num=0;num<tmp-1;num++){
    	fprintf(fp,"%ld  %s  %f  %f  %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
    }
	printf("刪除成功!\n");
	fclose(fp);
	return 0;
}

int rows(FILE *fp){
    char buf[1000];
    int lineCnt = 0;
    if((fp=fopen("timu.dat","r"))==NULL){
        printf("cannot open the file!");
        return 0;    
    }
    while (fgets(buf, 1000, fp)) // fgets循環讀取,直到文件最後,纔會返回NULL
        lineCnt++; // 累計行數
    fclose(fp);
    //printf("file line count = %d\n", lineCnt);
    return lineCnt;
}

int xiugai(FILE *fp,STU s[]){
	int q,num,fs,tmp;
	char sr[20];
	long int xiu;
	FILE *fpq;
	
	printf("請輸入想要修改的學生學號:\n");
	scanf("%ld",&xiu);
	printf("1、修改姓名;\n");
	printf("2、修改語文成績;\n");
	printf("3、修改數學成績;\n");
	printf("4、修改英語成績;\n");
	scanf("%d",&q);
	switch(q){
		case 1:{
			printf("輸入新姓名:\n");
			scanf("%s",sr);
			if((fp=fopen("timu.dat","r"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
			for(num=0;num<rows(fp);num++){
		    	fscanf(fp,"%ld %s %f %f %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
		    	if(s[num].sto==xiu){
		    		strcpy(s[num].stun,sr);
		    	}
		    }
		    fclose(fp);
		    tmp=rows(fp);
		    if((fp=fopen("timu.dat","w"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
		    for(num=0;num<tmp;num++){
		    	fprintf(fp,"%ld %s %f %f %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
		    }
		    fclose(fp);	
			break;
		}
		case 2:{
			printf("輸入新語文成績:\n");
			scanf("%d",&fs);
			if((fp=fopen("timu.dat","r"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
			for(num=0;num<rows(fp);num++){
		    	fscanf(fp,"%ld %s %f %f %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
		    	if(s[num].sto==xiu){
		    		s[num].goal[0]=fs;
		    	}
		    }
		    fclose(fp);
		    tmp=rows(fp);
		    if((fp=fopen("timu.dat","w"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
		    for(num=0;num<tmp;num++){
		    	fprintf(fp,"%ld %s %f %f %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
		    }
		    fclose(fp);	
			break;
		}
		case 3:{
			printf("輸入新數學成績:\n");
			scanf("%d",&fs);
			if((fp=fopen("timu.dat","r"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
			for(num=0;num<rows(fp);num++){
		    	fscanf(fp,"%ld %s %f %f %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
		    	if(s[num].sto==xiu){
		    		s[num].goal[1]=fs;
		    	}
		    }
		    fclose(fp);
		    tmp=rows(fp);
		    if((fp=fopen("timu.dat","w"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
		    for(num=0;num<tmp;num++){
		    	fprintf(fp,"%ld %s %f %f %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
		    }
		    fclose(fp);	
			break;
		}
		case 4:{
			printf("輸入新英語成績:\n");
			scanf("%d",&fs);
			if((fp=fopen("timu.dat","r"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
			for(num=0;num<rows(fp);num++){
		    	fscanf(fp,"%ld %s %f %f %f\n",&s[num].sto,s[num].stun,&s[num].goal[0],&s[num].goal[1],&s[num].goal[2]);
		    	if(s[num].sto==xiu){
		    		s[num].goal[2]=fs;
		    	}
		    }
		    fclose(fp);
		    if((fp=fopen("timu.dat","w"))==NULL){
		        printf("cannot open the file!");
		        return 0;    
		    }
		    for(num=0;num<tmp;num++){
		    	fprintf(fp,"%ld %s %f %f %f\n",s[num].sto,s[num].stun,s[num].goal[0],s[num].goal[1],s[num].goal[2]);
		    }
			fclose(fp);		
			break;
		}				
	}
}

int main(){
    STU s[N];
    FILE *fp;
    int i;
    while(1){
    	manu();
    	printf("請輸入以上操作序號:");
    	scanf("%d",&i);
    	switch(i){
    		case 1:
    			insert(fp,s);
    			break;
    		case 2:
    			secret(fp,s);
    			break;	
    		case 3:
    			add(fp,s);
    			break;	
    		case 4:
    			sort(fp,s);
    			break;	
    		case 5:
    			charu(fp,s);
    			break;	
    		case 6:
    			xiugai(fp,s);
    			break;	
			case 7:
				delet(fp,s);
    		case 0:
    			exit(0);
    	}
    }
    return 0;  
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章