Playing with fire
2021-05-09 21:41
采纳率: 100%
浏览 107

急救 vc代码应该怎样修改

#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];  /*教学效果评分*/

程序变得无法运行

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

10条回答 默认 最新

  • 正在学C++ 2021-05-10 16:04
    已采纳
    #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函数写入没有问题,但是写入的编码格式不是一般的格式,转来转去都看不了。反正系统能识别能读入读出是没有问题的。

    点赞 打赏 评论
  • Playing with fire 2021-05-09 22:11

     

    点赞 1 打赏 评论
  • CSDN专家-Time 2021-05-09 21:44

    你都只存了一个字符。当然只有最后一位。。。应该是结构体数组 存入和读写出的问题。

    点赞 打赏 评论
  • 最好不要存储为txt文件,把教师信息定义一个结构体,对结构体操作,妥妥的。

    点赞 打赏 评论
  • 正在学C++ 2021-05-09 21:55

    你的职工号是5为数,改成char数组。在插入的时候出错了,

    scanf("%s",tea[i+1].number);//不要加取址符

    你的教学效果评分都是一个分数了,用char数组或者int。单个字符不能存储。同样在插入的时候出错

    scanf("%s",tea[i+1].effectiveness);

    你的其他数组成员在输入的时候都是加了&,很奇怪竟然能获取输入

     

    点赞 打赏 评论
  • Playing with fire 2021-05-09 22:44

    这是另一个版本

    #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);
    	}
    }
    
    
    

    但结果还是

     

    点赞 打赏 评论
  • Playing with fire 2021-05-09 23:23

    没有&号,写完性别F就无反应了,devc++也是如此

    点赞 打赏 评论
  • 正在学C++ 2021-05-10 00:12

    #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,一个函数里面有一次就行

    点赞 打赏 评论
  • 有问必答小助手 2021-05-10 10:49

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 打赏 评论
  • 有问必答小助手 2021-05-11 15:37

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    点赞 打赏 评论

相关推荐 更多相似问题