#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<dos.h>
#define LEN sizeof(struct teacher) /*宏定义自定义结构体类型的长度*/
#define FORMAT "%-15s%-15s%-5s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n" /*定义数据元素输出的格式*/
#define DATA &tea[i].name,&tea[i].number,&tea[i].sex,&tea[i].title,&tea[i].project1,&tea[i].project2,&tea[i].project3,&tea[i].degree,&tea[i].effectiveness,&tea[i].schoolterm
/*定义结构体类型的数组引用成员的输出列表*/
struct teacher /*定义教师结构体*/
{
char name[15]; /*教师姓名*/
char number; /*职工号*/
char sex; /*性别*/
char title[15]; /*职称*/
char project1[15]; /*主讲科目1*/
char project2[15]; /*主讲科目2*/
char project3[15]; /*主讲科目3*/
char degree[15]; /*学位性质*/
char effectiveness; /*教学效果评分*/
char schoolterm[15]; /*办学日期*/
};
struct teacher tea[20];
int n;
void menu();
void in();
void search();
void del();
void modify();
void insert();
void order();
void show();
void menu()/*声明功能模板的函数,自定义函数实现菜单功能*/
{
system("cls"); /*调用系统命令cls完成清屏操作,即清空屏幕*/
printf("\n\n");
printf("\t\t|----------学院教学信息管理系统---------|\n");
printf("\t\t|\t |\n");
printf("\t\t|\t 1.录入教师信息 |\n");
printf("\t\t|\t 2.查找教师信息 |\n");
printf("\t\t|\t 3.删除教师信息 |\n");
printf("\t\t|\t 4.修改教师信息 |\n");
printf("\t\t|\t 5.插入教师信息 |\n");
printf("\t\t|\t 6.按教学效果评分排序\t |\n");
printf("\t\t|\t 7.显示所有教师信息\t |\n");
printf("\t\t|\t 0.退出系统 |\n");
printf("\t\t|\t |\n");
printf("\t\t|---------------------------------------|\n");
printf("\t\t| 请选择(0~7): |\n");
}
void main()/*主函数*/
{
system("color f0\n");
/*发出一个DOS命令,用于执行系统命令,颜色属性由两个十六进制数字指定(前景后字),“f”代表亮白色,“0”代表黑色,即“白地黑字”*/
menu();
scanf("%d",&n);
/*输入选择功能的编号,程序会根据该数字调用不同的函数*/
while(n)
{
switch(n)
{case 1: in();break; /*录入教师信息*/
case 2: search();break; /*查找教师信息*/
case 3: del();break; /*删除教师信息*/
case 4: modify();break; /*修改教师信息*/
case 5: insert();break; /*插入教师信息*/
case 6: order();break; /*按教学效果成绩排序*/
case 7: show();break; /*显示教师信息*/
default: break; /*退出程序*/
}
getch();
menu();/*执行完功能再次显示菜单界面*/
scanf("%d",&n);
}
}
void in() /*定义in函数,录入教师信息*/
{
char i,m=0; /*m是记录的条数*/
char ch[2]; /*定义字符型一维数组ch*/
FILE *fp; /*定义一个指向文件的指针变量fp*/
if((fp=fopen("data.txt","a+"))==NULL)
/*对磁盘文件进行操作处理需要首先打开指定文件,如果指定文件不存在便会出错*/
/*将fopen函数的返回值赋给指针变量fp,打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当检查到文件未结束时*/
{
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
{m++;} /*统计当前记录条数*/
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件中没有记录!\n");}
else
{show();}
/*如果录入信息时,查询到文件data中有数据,会首先调用show函数显示原有信息,再询问是否插入数据以添加信息*/
if((fp=fopen("data.txt","wb"))==NULL)/*判断读写的文本文件是否存在*/
{printf("文件不存在!\n");return;}
printf("输入教师信息(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息,Y/y即要录入*/
{
printf("请输入职工号number:");
scanf("%s",&tea[m].number);/*输入要插入的职工号*/
for(i=0;i<m;i++)
if(tea[i].number==tea[m].number)
{
printf("该职工号number已存在,按任意键继续!\n");
/*如果选择插入数据,系统首先会对输入的职工号进行检查,只有在输入的职工号与已存在的职工号不重复的情况下,才能继续输入其他老师的信息*/
getch();
fclose(fp);
return;
}
printf("不存在该教师信息,请继续!\n");
printf("姓名:\n");
scanf("%s",&tea[m].name);
printf("职工号:\n");
scanf("%s",&tea[m].number);
printf("性别(F/M):\n");
scanf("%s",&tea[m].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):\n");
scanf("%s",&tea[m].title);
printf("主讲科目1:\n");
scanf("%s",&tea[m].project1);
printf("主讲科目2:\n");
scanf("%s",&tea[m].project2);
printf("主讲科目3:\n");
scanf("%s",&tea[m].project3);
printf("学位性质(学位degree/非学位non degree):\n");
scanf("%s",&tea[m].degree);
printf("教学效果综合评分(0~100分):\n");
scanf("%s",&tea[m].effectiveness);
printf("办学日期:\n");
scanf("%s",&tea[m].schoolterm);
if(fwrite(&tea[m],LEN,1,fp)!=1) /*将录入的信息写入指定的磁盘文件*/
/*将&tea[m]所指的1*LEN个字节输出到fp所指文件中*/
{printf("不能保存!");getch();}
else
{printf("\t%s\t已被保存!\n ",tea[m].name);
m++;} /*统计当前记录条数*/
printf("继续?(y/n):"); /*询问是否继续*/
scanf("%s",ch);
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("OK!\n");
}
void search() /*定义search函数,根据职工号查找教师信息*/
{
FILE *fp; /*定义文件指针*/
char snum,i,m=0;
if((fp=fopen("data.txt","rb"))==NULL) /*查询的文件中不存在该职工号*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件不存在!\n");return;}
printf("请输入职工号number:");
scanf("%s",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*查找输入的职工号是否在记录中*/
{
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
printf(FORMAT,DATA);
/*将查找出的结果按指定格式输出*/
break;
}
if(i==m) printf("没有查询到该教师!\n");
}
void del() /*定义del函数*/
{
FILE *fp; /*定义文件指针*/
char snum,i,j,m=0;
char ch[2];
if((fp=fopen("data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("请输入教师的职工号number:");
scanf("%s",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*匹配查找教师信息*/
{
printf("查询到该教师,是否删除?(y/n)"); /*是否删除该信息*/
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0) /*判断是否删除该信息*/
{
for(j=i;j<m;j++)
tea[j]=tea[j+1]; /*将后一个记录移到前一个记录的位置,以删除匹配查找出的教师信息*/
m--; /*记录的总数减1*/
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(j=0;j<m;j++) /*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&tea[m],LEN,1,fp)!=1)
{printf("can not save!\n");getch();}
fclose(fp);
printf("删除成功!\n");
}
else
{printf("找到了记录,选择不删除!");}/**/
break;
}
}
void modify() /*自定义修改函数*/
{
FILE *fp; /*定义文件指针*/
char snum,i=0,j=0,m=0;
if((fp=fopen("data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
show();
printf("请输入要修改的教师的number: ");
scanf("%s",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number)
{
printf("找到该名教师,可修改信息!\n");
printf("姓名:");
scanf("%s",&tea[i].name);
printf("职工号:");
scanf("%s",&tea[i].number);
printf("性别(F/M):");
scanf("%s",&tea[i].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",&tea[i].title);
printf("主讲科目1:");
scanf("%s",&tea[i].project1);
printf("主讲科目2:");
scanf("%s",&tea[i].project2);
printf("主讲科目3:");
scanf("%s",&tea[i].project3);
printf("学位性质(学位/非学位):");
scanf("%s",&tea[i].degree);
printf("教学效果综合评分(0~100分):");
scanf("%s",&tea[i].effectiveness);
printf("办学日期:");
scanf("%s",&tea[i].schoolterm);
if((fp=fopen("data.txt","wb"))==NULL)
{printf("不能打开文件!\n");return;}
for(j=0;j<m;j++) /*将新修改的信息写入指定的磁盘文件中*/
if(fwrite(&tea[j],LEN,1,fp)!=1)
{printf("不能保存文件!\n");getch();}
fclose(fp);
break;
}
if(m==0)
{printf("没有找到这名学生!\n");}
}
void insert() /*自定义插入函数*/
{
FILE *fp; /*定义文件指针*/
char snum,i,j,k,m=0;
if((fp=fopen("data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
printf("请输入要插入的位置(number)"); /*即插在该职工号后面*/
scanf("%s",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number) /*查找该职工号*/
break;
for(j=m-1;j>i;j--)
tea[j+1]=tea[j]; /*从最后一条记录开始均向后移一位*/
printf("现在请输入要插入的位置\n");
printf("number: ");
scanf("%s",&tea[i+1].number);
for(k=0;k<m;k++)
if(tea[k].number==tea[m].number)
{
printf("该教师的number已存在,请按任意键继续!");
getch();
fclose(fp);
return;
}
printf("姓名:");
scanf("%s",&tea[i+1].name);
printf("职工号:");
scanf("%s",&tea[i+1].number);
printf("性别(F/M):");
scanf("%s",&tea[i+1].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",&tea[i+1].title);
printf("主讲科目1:");
scanf("%s",&tea[i+1].project1);
printf("主讲科目2:");
scanf("%s",&tea[i+1].project2);
printf("主讲科目3:");
scanf("%s",&tea[i+1].project3);
printf("学位性质(学位degree/非学位non degree):");
scanf("%s",&tea[i+1].degree);
printf("教学效果综合评分(0~100分):");
scanf("%s",&tea[i+1].effectiveness);
printf("办学日期:");
scanf("%s",&tea[i+1].schoolterm);
printf("插入成功!按任意键返回主界面!");
if((fp=fopen("data.txt","wb"))==NULL)
{printf("不能打开!\n");return;}
for(k=0;k<=m;k++)
if(fwrite(&tea[k],LEN,1,fp)!=1) /*将新修改的信息写入指定的磁盘文件中*/
{printf("不能保存!");getch();}
fclose(fp);
}
void order() /*自定义排序函数,首先读出已录入的教师信息,将信息按照教学效果成绩排序*/
{
FILE *fp; /*定义文件指针*/
struct teacher t;
char i=0,j=0,m=0;
if((fp=fopen("data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{printf("文件中没有记录!\n");return;}
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m-1;i++) /*教学效果成绩从高到低排列*/
for(j=i+1;j<m;j++)
if(tea[i].effectiveness<tea[j].effectiveness)
{
t.effectiveness=tea[i].effectiveness;
tea[i].effectiveness=tea[j].effectiveness;
tea[j].effectiveness=t.effectiveness;
}
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m;i++)
if(fwrite(&tea[i],LEN,1,fp)!=1) /*将重新排序后的信息写入指定的磁盘文件中*/
{printf("%s 不能保存文件!\n");getch();}
fclose(fp);
printf("保存成功!\n");
}
void show()
{
FILE *fp;
char i,m=0;
fp=fopen("data.txt","rb"); /*打开一个文本文件只读*/
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
{
if(fread(&tea[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
for(i=0;i<m;i++)
{
printf(FORMAT,DATA);
}
}
教师信息管理系统
程序正常运行,选择1(录入教师信息),依次输入数据
然后再enter,选择不继续--n,然后退出程序
数据存入到程序运行时新建的data.txt,打开查看却发现10001变成1,91变成9
选择7(显示所有教师信息),却又变成这样
求解,是字节存储的问题吗
但char number; /*职工号*/改成char number[15]; /*职工号*/
char effectiveness; /*教学效果评分*/改成char effectiveness[15]; /*教学效果评分*/
程序变得无法运行
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define LEN sizeof(struct teacher) /*宏定义自定义结构体类型的长度*/
#define FORMAT "%-15s%-15d%-15c%-15s%-15s%-15s%-15s%-15s%-15d%-15s\n" /*定义数据元素输出的格式*/
#define DATA tea[i].name,tea[i].number,tea[i].sex,tea[i].title,tea[i].project1,tea[i].project2,tea[i].project3,tea[i].degree,tea[i].effectiveness,tea[i].schoolterm
/*定义结构体类型的数组引用成员的输出列表*/
struct teacher /*定义教师结构体*/
{
char name[15]; /*教师姓名*/
int number; /*职工号*/
char sex; /*性别*/
char title[15]; /*职称*/
char project1[15]; /*主讲科目1*/
char project2[15]; /*主讲科目2*/
char project3[15]; /*主讲科目3*/
char degree[15]; /*学位性质*/
int effectiveness; /*教学效果评分*/
char schoolterm[15]; /*办学日期*/
};
struct teacher tea[20];
int n;
void menu();
int in();
int search();
int del();
void modify();
void insert();
void order();
int show();
int readintea();
int writetotxt(int);
void scanfdata(int);
void menu()/*声明功能模板的函数,自定义函数实现菜单功能*/
{
system("cls"); /*调用系统命令cls完成清屏操作,即清空屏幕*/
printf("\n\n");
printf("\t\t|----------学院教学信息管理系统---------|\n");
printf("\t\t|\t |\n");
printf("\t\t|\t 1.录入教师信息 |\n");
printf("\t\t|\t 2.查找教师信息 |\n");
printf("\t\t|\t 3.删除教师信息 |\n");
printf("\t\t|\t 4.修改教师信息 |\n");
printf("\t\t|\t 5.插入教师信息 |\n");
printf("\t\t|\t 6.按教学效果评分排序\t |\n");
printf("\t\t|\t 7.显示所有教师信息\t |\n");
printf("\t\t|\t 0.退出系统 |\n");
printf("\t\t|\t |\n");
printf("\t\t|---------------------------------------|\n");
printf("\t\t| 请选择(0~7): |\n");
}
int main()/*主函数*/
{
system("color f0\n");
/*发出一个DOS命令,用于执行系统命令,颜色属性由两个十六进制数字指定(前景后字),“f”代表亮白色,“0”代表黑色,即“白地黑字”*/
menu();
scanf("%d",&n);
/*输入选择功能的编号,程序会根据该数字调用不同的函数*/
while(n)
{
switch(n)
{case 1: in();break; /*录入教师信息*/
case 2: search();break; /*查找教师信息*/
case 3: del();break; /*删除教师信息*/
case 4: modify();break; /*修改教师信息*/
case 5: insert();break; /*插入教师信息*/
case 6: order();break; /*按教学效果成绩排序*/
case 7: show();break; /*显示教师信息*/
default: break; /*退出程序*/
}
menu();/*执行完功能再次显示菜单界面*/
scanf("%d",&n);
}
return 0;
}
int in() /*定义in函数,录入教师信息*/
{
FILE *fp = fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","a");
char ch[15];
int m = show(); //读入数据
printf("输入教师信息(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息,Y/y即要录入*/
{
printf("请输入职工号number:");
scanf("%d",&tea[m].number);/*输入要插入的职工号*/
for(int i=0;i<m;i++)
if(tea[i].number==tea[m].number)
{
fclose(fp);
printf("该职工号number已存在,按任意键继续!\n");
/*如果选择插入数据,系统首先会对输入的职工号进行检查,只有在输入的职工号与已存在的职工号不重复的情况下,才能继续输入其他老师的信息*/
getch();
return 0;
}
printf("不存在该教师信息,请继续!\n");
scanfdata(m);
if(fwrite(&tea[m],LEN,1,fp)!=1) /*将录入的信息写入指定的磁盘文件*/
/*将&tea[m]所指的1*LEN个字节输出到fp所指文件中*/
{printf("不能保存!");getch();}
else{
printf("\t%s\t已被保存!\n ",tea[m].name);
m++;
} /*统计当前记录条数*/
printf("继续?(y/n):"); /*询问是否继续*/
scanf("%s",ch);
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("OK!\n");
}
int search() /*定义search函数,根据职工号查找教师信息*/
{
int m = readintea(), i;
int snum;
printf("请输入职工号number:");
scanf("%d",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[i].number) /*查找输入的职工号是否在记录中*/
{
printf("%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n","name","number","sex","title","project1","project2","project3","degree","effectiveness","schoolterm");
printf(FORMAT,DATA);
/*将查找出的结果按指定格式输出*/
break;
}
if(i==m) {
printf("没有查询到该教师!\n");
printf("按任意键返回菜单!\n");
getch();
return 0;
}
printf("按任意键返回菜单!\n");
getch();
return 1;
}
int del() /*定义del函数*/
{
int snum,i,j;
char ch[2];
int m = readintea();
printf("请输入教师的职工号number:");
scanf("%d",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[i].number) /*匹配查找教师信息*/
{
printf(FORMAT,DATA);
printf("查询到该教师,是否删除?(y/n)"); /*是否删除该信息*/
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0) /*判断是否删除该信息*/
{
for(j=i+1;j<m;j++)
tea[j-1]=tea[j]; /*将后一个记录移到前一个记录的位置,以删除匹配查找出的教师信息*/
m--; /*记录的总数减1*/
writetotxt(m);
printf("删除成功!\n");
}
else printf("找到了记录,选择不删除!\n");
break;
}
show();
return 1;
}
void modify() /*自定义修改函数*/
{
int m = readintea(),snum,i;
show();
printf("请输入要修改的教师的number: ");
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number)
{
printf("找到该名教师,可修改信息!\n");
printf(FORMAT,DATA);
scanfdata(i);
writetotxt(m);
printf("修改成功\n");
printf(FORMAT,DATA);
break;
}
if(i==m)
{printf("没有找到这条记录!\n");}
printf("按任意键继续!\n");
getch();
}
void insert() /*自定义插入函数*/
{
int snum,i,j,k,number;
int m = readintea();
printf("现在请输入要教师number:\n");
scanf("%d",&number);
for(k=0;k<m;k++)
if(number==tea[k].number)
{
i = k;
printf(FORMAT,DATA);
printf("该教师的number已存在,按任意键返回菜单!");
getch();
return;
}
printf("请输入要插入的位置:"); /*即插在该位置*/// 1<=snum<=m+1
scanf("%d",&snum);
if (snum<0 || snum>m+1){
printf("位置不合法,按任意键返回菜单!\n");
getch();
return;
}
for(j=m-1;j>=snum-1;j--)
tea[j+1]=tea[j]; /*从最后一条记录开始均向后移一位*/
i = snum-1; //插入位置下标
scanfdata(i);
writetotxt(m+1);
show();
}
void scanfdata(int i){
printf("姓名:");
scanf("%s",tea[i].name);
printf("职工号:");
scanf("%d",&tea[i].number);
printf("性别(F/M):");
scanf("%s",&tea[i].sex);
printf("职称(正高级senior、副高级deputy_senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",tea[i].title);
printf("主讲科目1:");
scanf("%s",tea[i].project1);
printf("主讲科目2:");
scanf("%s",tea[i].project2);
printf("主讲科目3:");
scanf("%s",tea[i].project3);
printf("学位性质(学位degree/非学位non_degree):");
scanf("%s",tea[i].degree);
printf("教学效果综合评分(0~100分):");
scanf("%d",&tea[i].effectiveness);
printf("办学日期:");
scanf("%s",tea[i].schoolterm);
}
void order() /*自定义排序函数,首先读出已录入的教师信息,将信息按照教学效果成绩排序*/
{
FILE *fp; /*定义文件指针*/
struct teacher t;
int i=0,j=0;
int m = readintea();
if(m==0) {printf("There si no data.!\n");return;}
for(i=0;i<m-1;i++) /*教学效果成绩从高到低排列*/
for(j=0;j<m-1-i;j++)
if(tea[j].effectiveness<tea[j+1].effectiveness)
{
tea[m]=tea[j];
tea[j]=tea[j+1];
tea[j+1]=tea[m];
}
writetotxt(m);
printf("排序成功!\n");
show();
printf("按任意键返回主界面!");
getch();
}
int readintea(){ //把数据从文本读入结构体
FILE *fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","r"); /*打开一个文本文件只读*/
int m=0;
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
{
if(fread(&tea[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
return m;
}
int writetotxt(int m){ //把结构体前m个数据写入文本
FILE *fp = fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","w"); /*定义文件指针*/
for(int j=0;j<m;j++){ /*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&tea[j],LEN,1,fp)!=1)
printf("can not save!\n");
}
fclose(fp);
return 1;
}
int show()
{
int m = readintea(), i;
printf("%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n","name","number","sex","title","project1","project2","project3","degree","effectiveness","schoolterm");
if(m==0) {
printf("There is no data.\n");
printf("按任意键继续!\n");
getch();
return 0;
}
else for(i=0;i<m;i++) printf(FORMAT,DATA);
printf("按任意键继续!\n");
getch();
return m;
}
给你修改了一下。程序运行没有问题了,各种功能实现也没问题啦。
但是data.txt内部还会存在乱码,因为你的这个fwrite的原因,我也没有换用其他函数输出。fwrite函数写入没有问题,但是写入的编码格式不是一般的格式,转来转去都看不了。反正系统能识别能读入读出是没有问题的。
你都只存了一个字符。当然只有最后一位。。。应该是结构体数组 存入和读写出的问题。
最好不要存储为txt文件,把教师信息定义一个结构体,对结构体操作,妥妥的。
你的职工号是5为数,改成char数组。在插入的时候出错了,
scanf("%s",tea[i+1].number);//不要加取址符
你的教学效果评分都是一个分数了,用char数组或者int。单个字符不能存储。同样在插入的时候出错
scanf("%s",tea[i+1].effectiveness);
你的其他数组成员在输入的时候都是加了&,很奇怪竟然能获取输入
这是另一个版本
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<dos.h>
#define LEN sizeof(struct teacher) /*宏定义自定义结构体类型的长度*/
#define FORMAT "%-15s%-6d%-3s%-15s%-15s%-15s%-15s%-15s%-5d%-15s\n" /*定义数据元素输出的格式*/
#define DATA &tea[i].name,&tea[i].number,&tea[i].sex,&tea[i].title,&tea[i].project1,&tea[i].project2,&tea[i].project3,&tea[i].degree,&tea[i].effectiveness,&tea[i].schoolterm
/*定义结构体类型的数组引用成员的输出列表*/
struct teacher /*定义教师结构体*/
{
char name[15]; /*教师姓名*/
int number; /*职工号*/
char sex; /*性别*/
char title[15]; /*职称*/
char project1[15]; /*主讲科目1*/
char project2[15]; /*主讲科目2*/
char project3[15]; /*主讲科目3*/
char degree[15]; /*学位性质*/
int effectiveness; /*教学效果评分*/
char schoolterm[15]; /*办学日期*/
};
struct teacher tea[20];
int n;
void menu();
void in();
void search();
void del();
void modify();
void insert();
void order();
void show();
void menu()/*声明功能模板的函数,自定义函数实现菜单功能*/
{
system("cls"); /*调用系统命令cls完成清屏操作,即清空屏幕*/
printf("\n\n");
printf("\t\t|----------学院教学信息管理系统---------|\n");
printf("\t\t|\t |\n");
printf("\t\t|\t 1.录入教师信息 |\n");
printf("\t\t|\t 2.查找教师信息 |\n");
printf("\t\t|\t 3.删除教师信息 |\n");
printf("\t\t|\t 4.修改教师信息 |\n");
printf("\t\t|\t 5.插入教师信息 |\n");
printf("\t\t|\t 6.按教学效果评分排序\t |\n");
printf("\t\t|\t 7.显示所有教师信息\t |\n");
printf("\t\t|\t 0.退出系统 |\n");
printf("\t\t|\t |\n");
printf("\t\t|---------------------------------------|\n");
printf("\t\t| 请选择(0~7): |\n");
}
void main()/*主函数*/
{
system("color f0\n");
/*发出一个DOS命令,用于执行系统命令,颜色属性由两个十六进制数字指定(前景后字),“f”代表亮白色,“0”代表黑色,即“白地黑字”*/
menu();
scanf("%d",&n);
/*输入选择功能的编号,程序会根据该数字调用不同的函数*/
while(n)
{
switch(n)
{case 1: in();break; /*录入教师信息*/
case 2: search();break; /*查找教师信息*/
case 3: del();break; /*删除教师信息*/
case 4: modify();break; /*修改教师信息*/
case 5: insert();break; /*插入教师信息*/
case 6: order();break; /*按教学效果成绩排序*/
case 7: show();break; /*显示教师信息*/
default: break; /*退出程序*/
}
getch();
menu();/*执行完功能再次显示菜单界面*/
scanf("%d",&n);
}
}
void in() /*定义in函数,录入教师信息*/
{
int i,m=0; /*m是记录的条数*/
char ch[2]; /*定义字符型一维数组ch*/
FILE *fp; /*定义一个指向文件的指针变量fp*/
if((fp=fopen("data.txt","a+"))==NULL)
/*对磁盘文件进行操作处理需要首先打开指定文件,如果指定文件不存在便会出错*/
/*将fopen函数的返回值赋给指针变量fp,打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当检查到文件未结束时*/
{
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
{m++;} /*统计当前记录条数*/
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件中没有记录!\n");}
else
{show();}
/*如果录入信息时,查询到文件data中有数据,会首先调用show函数显示原有信息,再询问是否插入数据以添加信息*/
if((fp=fopen("data.txt","wb"))==NULL)/*判断读写的文本文件是否存在*/
{printf("文件不存在!\n");return;}
printf("输入教师信息(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息,Y/y即要录入*/
{
printf("请输入职工号number:");
scanf("%d",&tea[m].number);/*输入要插入的职工号*/
for(i=0;i<m;i++)
if(tea[i].number==tea[m].number)
{
printf("该职工号number已存在,按任意键继续!\n");
/*如果选择插入数据,系统首先会对输入的职工号进行检查,只有在输入的职工号与已存在的职工号不重复的情况下,才能继续输入其他老师的信息*/
getch();
fclose(fp);
return;
}
printf("不存在该教师信息,请继续!\n");
printf("姓名:\n");
scanf("%s",&tea[m].name);
printf("职工号:\n");
scanf("%d",&tea[m].number);
printf("性别(F/M):\n");
scanf("%s",&tea[m].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):\n");
scanf("%s",&tea[m].title);
printf("主讲科目1:\n");
scanf("%s",&tea[m].project1);
printf("主讲科目2:\n");
scanf("%s",&tea[m].project2);
printf("主讲科目3:\n");
scanf("%s",&tea[m].project3);
printf("学位性质(学位degree/非学位non degree):\n");
scanf("%s",&tea[m].degree);
printf("教学效果综合评分(0~100分):\n");
scanf("%d",&tea[m].effectiveness);
printf("办学日期:\n");
scanf("%s",&tea[m].schoolterm);
if(fwrite(&tea[m],LEN,1,fp)!=1) /*将录入的信息写入指定的磁盘文件*/
/*将&tea[m]所指的1*LEN个字节输出到fp所指文件中*/
{printf("不能保存!");getch();}
else
{printf("\t%s\t已被保存!\n ",tea[m].name);
m++;} /*统计当前记录条数*/
printf("继续?(y/n):"); /*询问是否继续*/
scanf("%s",ch);
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("OK!\n");
}
void search() /*定义search函数,根据职工号查找教师信息*/
{
FILE *fp; /*定义文件指针*/
int snum,i,m=0;
if((fp=fopen("data.txt","rb"))==NULL) /*查询的文件中不存在该职工号*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件不存在!\n");return;}
printf("请输入职工号number:");
scanf("%d",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*查找输入的职工号是否在记录中*/
{
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
printf(FORMAT,DATA);
/*将查找出的结果按指定格式输出*/
break;
}
if(i==m) printf("没有查询到该教师!\n");
}
void del() /*定义del函数*/
{
FILE *fp; /*定义文件指针*/
int snum,i,j,m=0;
char ch[2];
if((fp=fopen("data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("请输入教师的职工号number:");
scanf("%d",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*匹配查找教师信息*/
{
printf("查询到该教师,是否删除?(y/n)"); /*是否删除该信息*/
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0) /*判断是否删除该信息*/
{
for(j=i;j<m;j++)
tea[j]=tea[j+1]; /*将后一个记录移到前一个记录的位置,以删除匹配查找出的教师信息*/
m--; /*记录的总数减1*/
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(j=0;j<m;j++) /*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&tea[m],LEN,1,fp)!=1)
{printf("can not save!\n");getch();}
fclose(fp);
printf("删除成功!\n");
}
else
{printf("找到了记录,选择不删除!");}/**/
break;
}
}
void modify() /*自定义修改函数*/
{
FILE *fp; /*定义文件指针*/
int snum,i=0,j=0,m=0;
if((fp=fopen("data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
show();
printf("请输入要修改的教师的number: ");
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number)
{
printf("找到该名教师,可修改信息!\n");
printf("姓名:");
scanf("%s",&tea[i].name);
printf("职工号:");
scanf("%d",&tea[i].number);
printf("性别(F/M):");
scanf("%s",&tea[i].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",&tea[i].title);
printf("主讲科目1:");
scanf("%s",&tea[i].project1);
printf("主讲科目2:");
scanf("%s",&tea[i].project2);
printf("主讲科目3:");
scanf("%s",&tea[i].project3);
printf("学位性质(学位/非学位):");
scanf("%s",&tea[i].degree);
printf("教学效果综合评分(0~100分):");
scanf("%d",&tea[i].effectiveness);
printf("办学日期:");
scanf("%s",&tea[i].schoolterm);
if((fp=fopen("data.txt","wb"))==NULL)
{printf("不能打开文件!\n");return;}
for(j=0;j<m;j++) /*将新修改的信息写入指定的磁盘文件中*/
if(fwrite(&tea[j],LEN,1,fp)!=1)
{printf("不能保存文件!\n");getch();}
fclose(fp);
break;
}
if(m==0)
{printf("没有找到这名学生!\n");}
}
void insert() /*自定义插入函数*/
{
FILE *fp; /*定义文件指针*/
int snum,i,j,k,m=0;
if((fp=fopen("data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
printf("请输入要插入的位置(number)"); /*即插在该职工号后面*/
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number) /*查找该职工号*/
break;
for(j=m-1;j>i;j--)
tea[j+1]=tea[j]; /*从最后一条记录开始均向后移一位*/
printf("现在请输入要插入的位置\n");
printf("number: ");
scanf("%d",&tea[i+1].number);
for(k=0;k<m;k++)
if(tea[k].number==tea[m].number)
{
printf("该教师的number已存在,请按任意键继续!");
getch();
fclose(fp);
return;
}
printf("姓名:");
scanf("%s",&tea[i+1].name);
printf("职工号:");
scanf("%d",&tea[i+1].number);
printf("性别(F/M):");
scanf("%s",&tea[i+1].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",&tea[i+1].title);
printf("主讲科目1:");
scanf("%s",&tea[i+1].project1);
printf("主讲科目2:");
scanf("%s",&tea[i+1].project2);
printf("主讲科目3:");
scanf("%s",&tea[i+1].project3);
printf("学位性质(学位degree/非学位non degree):");
scanf("%s",&tea[i+1].degree);
printf("教学效果综合评分(0~100分):");
scanf("%d",&tea[i+1].effectiveness);
printf("办学日期:");
scanf("%s",&tea[i+1].schoolterm);
printf("插入成功!按任意键返回主界面!");
if((fp=fopen("data.txt","wb"))==NULL)
{printf("不能打开!\n");return;}
for(k=0;k<=m;k++)
if(fwrite(&tea[k],LEN,1,fp)!=1) /*将新修改的信息写入指定的磁盘文件中*/
{printf("不能保存!");getch();}
fclose(fp);
}
void order() /*自定义排序函数,首先读出已录入的教师信息,将信息按照教学效果成绩排序*/
{
FILE *fp; /*定义文件指针*/
struct teacher t;
int i=0,j=0,m=0;
if((fp=fopen("data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{printf("文件中没有记录!\n");return;}
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m-1;i++) /*教学效果成绩从高到低排列*/
for(j=i+1;j<m;j++)
if(tea[i].effectiveness<tea[j].effectiveness)
{
t.effectiveness=tea[i].effectiveness;
tea[i].effectiveness=tea[j].effectiveness;
tea[j].effectiveness=t.effectiveness;
}
if((fp=fopen("data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m;i++)
if(fwrite(&tea[i],LEN,1,fp)!=1) /*将重新排序后的信息写入指定的磁盘文件中*/
{printf("%s 不能保存文件!\n");getch();}
fclose(fp);
printf("保存成功!\n");
}
void show()
{
FILE *fp;
int i,m=0;
fp=fopen("data.txt","rb"); /*打开一个文本文件只读*/
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
{
if(fread(&tea[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
for(i=0;i<m;i++)
{
printf(FORMAT,DATA);
}
}
但结果还是
没有&号,写完性别F就无反应了,devc++也是如此
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<dos.h>
#define LEN sizeof(struct teacher) /*宏定义自定义结构体类型的长度*/
#define FORMAT "%-15s%-6d%-3c%-15s%-15s%-15s%-15s%-15s%-5d%-15s\n" /*定义数据元素输出的格式*/
#define DATA tea[i].name,tea[i].number,tea[i].sex,tea[i].title,tea[i].project1,tea[i].project2,tea[i].project3,tea[i].degree,tea[i].effectiveness,tea[i].schoolterm
/*定义结构体类型的数组引用成员的输出列表*/
struct teacher /*定义教师结构体*/
{
char name[15]; /*教师姓名*/
int number; /*职工号*/
char sex; /*性别*/
char title[15]; /*职称*/
char project1[15]; /*主讲科目1*/
char project2[15]; /*主讲科目2*/
char project3[15]; /*主讲科目3*/
char degree[15]; /*学位性质*/
int effectiveness; /*教学效果评分*/
char schoolterm[15]; /*办学日期*/
};
struct teacher tea[20];
int n;
void menu();
void in();
void search();
void del();
void modify();
void insert();
void order();
void show();
void menu()/*声明功能模板的函数,自定义函数实现菜单功能*/
{
system("cls"); /*调用系统命令cls完成清屏操作,即清空屏幕*/
printf("\n\n");
printf("\t\t|----------学院教学信息管理系统---------|\n");
printf("\t\t|\t |\n");
printf("\t\t|\t 1.录入教师信息 |\n");
printf("\t\t|\t 2.查找教师信息 |\n");
printf("\t\t|\t 3.删除教师信息 |\n");
printf("\t\t|\t 4.修改教师信息 |\n");
printf("\t\t|\t 5.插入教师信息 |\n");
printf("\t\t|\t 6.按教学效果评分排序\t |\n");
printf("\t\t|\t 7.显示所有教师信息\t |\n");
printf("\t\t|\t 0.退出系统 |\n");
printf("\t\t|\t |\n");
printf("\t\t|---------------------------------------|\n");
printf("\t\t| 请选择(0~7): |\n");
}
int main()/*主函数*/
{
system("color f0\n");
/*发出一个DOS命令,用于执行系统命令,颜色属性由两个十六进制数字指定(前景后字),“f”代表亮白色,“0”代表黑色,即“白地黑字”*/
menu();
scanf("%d",&n);
/*输入选择功能的编号,程序会根据该数字调用不同的函数*/
while(n)
{
switch(n)
{case 1: in();break; /*录入教师信息*/
case 2: search();break; /*查找教师信息*/
case 3: del();break; /*删除教师信息*/
case 4: modify();break; /*修改教师信息*/
case 5: insert();break; /*插入教师信息*/
case 6: order();break; /*按教学效果成绩排序*/
case 7: show();break; /*显示教师信息*/
default: break; /*退出程序*/
}
getch();
menu();/*执行完功能再次显示菜单界面*/
scanf("%d",&n);
}
return 0;
}
void in() /*定义in函数,录入教师信息*/
{
int i,m=0; /*m是记录的条数*/
char ch[2]; /*定义字符型一维数组ch*/
FILE *fp; /*定义一个指向文件的指针变量fp*/
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","a+"))==NULL)
/*对磁盘文件进行操作处理需要首先打开指定文件,如果指定文件不存在便会出错*/
/*将fopen函数的返回值赋给指针变量fp,打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当检查到文件未结束时*/
{
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
{m++;} /*统计当前记录条数*/
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件中没有记录!\n");}
else
{show();}
/*如果录入信息时,查询到文件data中有数据,会首先调用show函数显示原有信息,再询问是否插入数据以添加信息*/
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","wb"))==NULL)/*判断读写的文本文件是否存在*/
{printf("文件不存在!\n");return;}
printf("输入教师信息(y/n):");
scanf("%s",ch);
while(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判断是否要录入新信息,Y/y即要录入*/
{
printf("请输入职工号number:");
scanf("%d",&tea[m].number);/*输入要插入的职工号*/
for(i=0;i<m;i++)
if(tea[i].number==tea[m].number)
{
printf("该职工号number已存在,按任意键继续!\n");
/*如果选择插入数据,系统首先会对输入的职工号进行检查,只有在输入的职工号与已存在的职工号不重复的情况下,才能继续输入其他老师的信息*/
getch();
fclose(fp);
return;
}
printf("不存在该教师信息,请继续!\n");
printf("姓名:\n");
scanf("%s",tea[m].name);
printf("职工号:\n");
scanf("%d",&tea[m].number);
printf("性别(F/M):\n");
scanf("%s",&tea[m].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):\n");
scanf("%s",tea[m].title);
printf("主讲科目1:\n");
scanf("%s",tea[m].project1);
printf("主讲科目2:\n");
scanf("%s",tea[m].project2);
printf("主讲科目3:\n");
scanf("%s",tea[m].project3);
printf("学位性质(学位degree/非学位non degree):\n");
scanf("%s",tea[m].degree);
printf("教学效果综合评分(0~100分):\n");
scanf("%d",&tea[m].effectiveness);
printf("办学日期:\n");
scanf("%s",tea[m].schoolterm);
if(fwrite(&tea[m],LEN,1,fp)!=1) /*将录入的信息写入指定的磁盘文件*/
/*将&tea[m]所指的1*LEN个字节输出到fp所指文件中*/
{printf("不能保存!");getch();}
else
{printf("\t%s\t已被保存!\n ",tea[m].name);
m++;} /*统计当前记录条数*/
printf("继续?(y/n):"); /*询问是否继续*/
scanf("%s",ch);
}
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("OK!\n");
}
void search() /*定义search函数,根据职工号查找教师信息*/
{
FILE *fp; /*定义文件指针*/
int snum,i,m=0;
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","rb"))==NULL) /*查询的文件中不存在该职工号*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
if(m==0) /*判断磁盘文件是否有存储记录,m如果等于0即无存储记录*/
{printf("文件不存在!\n");return;}
printf("请输入职工号number:");
scanf("%d",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*查找输入的职工号是否在记录中*/
{
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
printf(FORMAT,DATA);
/*将查找出的结果按指定格式输出*/
break;
}
if(i==m) printf("没有查询到该教师!\n");
}
void del() /*定义del函数*/
{
FILE *fp; /*定义文件指针*/
int snum,i,j,m=0;
char ch[2];
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
fclose(fp); /*保存文件后关闭fp所指文件,释放文件缓冲区*/
printf("请输入教师的职工号number:");
scanf("%d",&snum); /*将输入的职工号赋给snum*/
for(i=0;i<m;i++)
if(snum==tea[m].number) /*匹配查找教师信息*/
{
printf("查询到该教师,是否删除?(y/n)"); /*是否删除该信息*/
scanf("%s",ch);
if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0) /*判断是否删除该信息*/
{
for(j=i;j<m;j++)
tea[j]=tea[j+1]; /*将后一个记录移到前一个记录的位置,以删除匹配查找出的教师信息*/
m--; /*记录的总数减1*/
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(j=0;j<m;j++) /*将更改后的记录重新写入指定的磁盘文件中*/
if(fwrite(&tea[m],LEN,1,fp)!=1)
{printf("can not save!\n");getch();}
fclose(fp);
printf("删除成功!\n");
}
else
{printf("找到了记录,选择不删除!");}/**/
break;
}
}
void modify() /*自定义修改函数*/
{
FILE *fp; /*定义文件指针*/
int snum,i=0,j=0,m=0;
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","r+"))==NULL) /*打开一个文本文件进行读写*/
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
/*从fp所指文件中读取长度为LEN的1个数据项,存到地址为&teacher[m]的内存区中*/
m++; /*统计当前记录条数*/
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
show();
printf("请输入要修改的教师的number: ");
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number)
{
printf("找到该名教师,可修改信息!\n");
printf("姓名:");
scanf("%s",tea[i].name);
printf("职工号:");
scanf("%d",&tea[i].number);
printf("性别(F/M):");
scanf("%s",&tea[i].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",tea[i].title);
printf("主讲科目1:");
scanf("%s",tea[i].project1);
printf("主讲科目2:");
scanf("%s",tea[i].project2);
printf("主讲科目3:");
scanf("%s",tea[i].project3);
printf("学位性质(学位/非学位):");
scanf("%s",tea[i].degree);
printf("教学效果综合评分(0~100分):");
scanf("%d",&tea[i].effectiveness);
printf("办学日期:");
scanf("%s",tea[i].schoolterm);
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","wb"))==NULL)
{printf("不能打开文件!\n");return;}
for(j=0;j<m;j++) /*将新修改的信息写入指定的磁盘文件中*/
if(fwrite(&tea[j],LEN,1,fp)!=1)
{printf("不能保存文件!\n");getch();}
fclose(fp);
break;
}
if(m==0)
{printf("没有找到这名学生!\n");}
}
void insert() /*自定义插入函数*/
{
FILE *fp; /*定义文件指针*/
int snum,i,j,k,m=0;
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
if(m==0)
{printf("文件中没有记录!\n");fclose(fp);return;}
printf("请输入要插入的位置(number)"); /*即插在该职工号后面*/
scanf("%d",&snum);
for(i=0;i<m;i++)
if(snum==tea[i].number) /*查找该职工号*/
break;
for(j=m-1;j>i;j--)
tea[j+1]=tea[j]; /*从最后一条记录开始均向后移一位*/
printf("现在请输入要插入的位置\n");
printf("number: ");
scanf("%d",&tea[i+1].number);
for(k=0;k<m;k++)
if(tea[k].number==tea[m].number)
{
printf("该教师的number已存在,请按任意键继续!");
getch();
fclose(fp);
return;
}
printf("姓名:");
scanf("%s",tea[i+1].name);
printf("职工号:");
scanf("%d",&tea[i+1].number);
printf("性别(F/M):");
scanf("%s",&tea[i+1].sex);
printf("职称(正高级senior、副高级deputy senior、中级intermediate、助理级assistant、员级member):");
scanf("%s",tea[i+1].title);
printf("主讲科目1:");
scanf("%s",tea[i+1].project1);
printf("主讲科目2:");
scanf("%s",tea[i+1].project2);
printf("主讲科目3:");
scanf("%s",tea[i+1].project3);
printf("学位性质(学位degree/非学位non degree):");
scanf("%s",tea[i+1].degree);
printf("教学效果综合评分(0~100分):");
scanf("%d",&tea[i+1].effectiveness);
printf("办学日期:");
scanf("%s",tea[i+1].schoolterm);
printf("插入成功!按任意键返回主界面!");
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","wb"))==NULL)
{printf("不能打开!\n");return;}
for(k=0;k<=m;k++)
if(fwrite(&tea[k],LEN,1,fp)!=1) /*将新修改的信息写入指定的磁盘文件中*/
{printf("不能保存!");getch();}
fclose(fp);
}
void order() /*自定义排序函数,首先读出已录入的教师信息,将信息按照教学效果成绩排序*/
{
FILE *fp; /*定义文件指针*/
struct teacher t;
int i=0,j=0,m=0;
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","r+"))==NULL)
{printf("文件不存在!\n");return;}
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
if(fread(&tea[m],LEN,1,fp)==1)
m++;
fclose(fp);
if(m==0)
{printf("文件中没有记录!\n");return;}
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m-1;i++) /*教学效果成绩从高到低排列*/
for(j=i+1;j<m;j++)
if(tea[i].effectiveness<tea[j].effectiveness)
{
t.effectiveness=tea[i].effectiveness;
tea[i].effectiveness=tea[j].effectiveness;
tea[j].effectiveness=t.effectiveness;
}
if((fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","wb"))==NULL)
{printf("文件不存在!\n");return;}
for(i=0;i<m;i++)
if(fwrite(&tea[i],LEN,1,fp)!=1) /*将重新排序后的信息写入指定的磁盘文件中*/
{printf("不能保存文件!\n");getchar();}
fclose(fp);
printf("保存成功!\n");
}
void show()
{
FILE *fp;
int i,m=0;
fp=fopen("F:\\CCCCCCCCCCCCCCC\\clion_work\\Test\\data.txt","rb"); /*打开一个文本文件只读*/
while(!feof(fp)) /*当文件指针没有到达文件结尾(文件读取尚未结束)时执行*/
{
if(fread(&tea[m],LEN,1,fp)==1)
m++;
}
fclose(fp);
printf("name number sex title project1 project2 project3 degree effectiveness schoolterm\t\t\n");
for(i=0;i<m;i++)
{
printf(FORMAT,DATA);
}
}
问题:
if(fwrite(&tea[m],LEN,1,fp)!=1) /*将录入的信息写入指定的磁盘文件*/你的这里写进去有错。你可以尝试换一种写入,一个一个的写进去。
每次从文件中读出数据似乎是破坏性的,数据会消失。
你每次写入数据,会覆盖而不是接在后面写入。
你不需要重复多次fopen,一个函数里面有一次就行
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y