對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;
}