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