1.in函数里数据输入后文字可以在txt文件里正常显示,但是数字不行
2.delet update select 函数中无法在txt文件里找到对应学号
3.print函数中输出所有数据时总会多输出几遍,而且会多一些奇奇怪怪的东西。
- #include <stdio.h>
#include<string.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
//学生信息结构体
struct student
{int num;
char name[10];
char clas[10];
char sex[8];
float Eng_score;
float C_score;
};
struct student stu[50];
//系统操作
void menu()
{
printf("\n\n\n");
printf("\t\t-------------------------------------------------\n");
printf("\t\t|| ---------------- ||\n");
printf("\t\t||**************学生信息管理系统***************||\n");
printf("\t\t|| ---------------- ||\n");
printf("\t\t|| ||\n");
printf("\t\t||~~~~~~~~~~~~~~~1.录入学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~2.删除学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~3.修改学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~4.查询学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~5.显示学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~6.清屏~~~~~~~~~~~~~~~~~~~~~~~~||\n");
printf("\t\t|| ||\n");
printf("\t\t||*********************************************||\n");
}
```//录入学生信息 //数字不能正常显示
void in()
{
FILE *fp;
int i, m=0;
char ch[2];
if((fp=fopen("E://大二/算法/stu.txt","r"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件没有内容\n");
}
if((fp=fopen("E://大二/算法/stu.txt","at+"))==NULL)
{
printf("文件打开失败\n");
return;
}
printf(" 输入学生信息(是/否);\n");
scanf("%s",ch);
while(strcmp(ch,"是")==0)
{
printf("number:\n");
scanf("%9d",&stu[m].num);
for(i=0;i<m;i++)
{
if(stu[i].num==stu[m].num)
{
printf("您的信息已存在\n");
fclose(fp);
getchar();
return;
}
}
printf(" name:\n");
fflush(stdin);
scanf("%s",stu[m].name);
fflush(stdin);
printf(" class:\n");
fflush(stdin);
scanf("%s",stu[m].clas);
fflush(stdin);
printf(" sex:\n");
scanf("%s",stu[i].sex);
fflush(stdin);
printf(" Eng_score:\n");
scanf("%f",&stu[m].Eng_score);
fflush(stdin);
printf(" C_score:\n");
scanf("%f",&stu[m].C_score);
fflush(stdin);
if(fwrite(&stu[m],LEN,1,fp)!=1)
{
printf("不能保存\n");
getchar();
}
else
{
printf("信息保存成功\n");
m++;
}
printf("是否继续录入学生信息(是/否):");
scanf("%s",ch);
}
fclose(fp);
}
//删除学生信息
void delet()
{
FILE *fp;
int num,m=0;
int i,j;
int flag=0;
char ch[2];
if((fp=fopen("E://大二/算法/stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有学生信息\n");
}
else
{
printf("请输入需要删除学生信息的学号:");
scanf("%d",&num);
}
for(i=0;i<m;i++)
{
if(stu[i].num==num)
{
printf("该学生已找到,是否删除(y/n):");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
for(j=i;j<m;j++)
{
stu[j]=stu[j+1];
}
m--;
flag=1;
if((fp=fopen("E://大二/算法/stu.txt","wb"))==NULL)
{
printf("文件打开失败\n");
return;
}
for(j=0;j<m;j++)
{
if(fwrite(&stu[j],LEN,1,fp)!=1)
{
printf("不能保存\n");
getchar();
}
}
fclose(fp);
printf("删除成功!\n");break;
}
else
{
printf("学生信息存在,不需要删除。");
break;
}
}
}
if(m==i&&flag==0)
{
printf("未找到该学生");
}
}
//修改学生信息
void updet()
{
int num;
char name[10];
char clas[20];
char sex[5];
float Eng_score;
float C_score;
FILE *fp;
int m=0,a;
int i,j;
if((fp=fopen("E://大二/算法/stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有学生信息\n");
}
else
{
//print();
printf("请输入需要修改学生信息的学号:");
scanf("%d",&num);
}
for(i=0;i<m;i++)
{
if(num==stu[i].num)
{
printf("1:学号,2:姓名,3:班级,4:性别,5:英语成绩,6:C语言成绩\n");
printf("该学生已被找到,请选择需要修改的内容(1-5):");
scanf("%d",&a);
while(a)
{
switch (a)
{
case 1:
printf("将%d学生的学号修改为:",num);
scanf("%d",&num);
stu[i].num=num;
for(j=i+1;j<m;j++)
{
if(stu[j].num==num)
{
printf("您修改的学号已存在\n");
getchar();
return;
}
}
break;
case 2:
printf("将%d学生的姓名修改为:",num);
scanf("%s",name);
strcpy(stu[i].name,name);
break;
case 3:
printf("将%d学生的班级修改为:",num);
scanf("%s",clas);
strcpy(stu[i].clas,clas);
break;
case 4:
printf("将%d学生的性别修改为:",num);
scanf("%s",sex);
strcpy(stu[i].sex,sex);
break;
case 5:
printf("将%d学生的英语成绩修改为:",num);
scanf("%f",&Eng_score);
stu[i].Eng_score=Eng_score;
break;
case 6:
printf("将%d学生的C语言成绩修改为:",num);
scanf("%f",&C_score);
stu[i].C_score=C_score;
break;
default:
printf("选择错误,请重新选择需要修改的内容:");
scanf("%d",&a);
break;
}
printf("请选择需要修改的内容(如果已修改完成请按0):");
scanf("%d",&a);
}
if((fp=fopen("stu.txt","wb"))==NULL)
{
printf("文件打开失败\n");
return;
}
for(j=0;j<m;j++)
{
if(fwrite(&stu[j],LEN,1,fp)!=1)
{
printf("不能保存\n");
getchar();
}
}
fclose(fp);
printf("修改成功!\n");
break;
}
}
if(m==i)
{
printf("未找到该学生\n");
}
}
//查询学生信息
void select()
{
int num,m=0;
int i;
FILE *fp;
if((fp=fopen("E://大二/算法/stu.txt","rt+"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件没有内容\n");
return;
}
printf("请输入学生学号进行查询:");
scanf("%d",&num);
for(i=0;i<m;i++)
{
if(num==stu[i].num)
{
printf("\n");
printf("该学生信息已被查到;\n");
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t\n");
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score);
break;
}
}
if(m==i)
{
printf("该学生信息不存在\n");
return;
}
}
//显示学生信息
void print()
{
int i,m=0;
FILE *fp;
if((fp=fopen("E://大二/算法/stu.txt","rt"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
} //得出txt中信息行数
}
fclose(fp);
if(m==0)
{
printf("文件中没有内容\n");
}
else
{
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\n");
for(i=0;i<m;i++)
{
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score);
}
}
}
//清屏
void clea()
{
system("cls");
}
int main()
{
menu();
int n;
printf("请选择功能(1-6):\n");
scanf("%d",&n);
while(n)
{
if(n>=1&&n<=9)
{
switch(n)
{
case 1:in();break;
case 2:delet();break;
case 3:updet();break;
case 4:select();break;
case 5:print();break;
case 6:clea();break;
}
if(n==6)
{
menu();
}
printf("\n");
printf("请选择功能(1-6):");
scanf("%d",&n);
}
else
{
printf("\n");
printf("请重新输入:");
scanf("%d",&n);
}
}
return 0;
}
不能直接取结构体的地址作为数据写入文件,写入文件都是要以字符串形式才可以。
char buf[100] = {0};
sprintf(buf, "%d\t%s\t%s\t%s\t%f\t%f\n", stu[m].num, stu[m].name, stu[m].clas, stu[m].sex, stu[m].Eng_score, stu[m].C_score); //按格式拼接一行数据
fwrite(&buf,strlen(buf),1,fp); //写入文件
如果按照上面的固定每行格式写入文件,读取的时候也就可以根据对应的格式进行读出来就可以了。
struct student stu;
int ret = fscanf(fp, "%d\t%s\t%s\t%s\t%f\t%f\n", &stu.num, stu.name, stu.clas, stu.sex, &stu.Eng_score, &stu.C_score); //按每行的固定格式读取
if(ret == 6) { //一行总共6个数据
printf("%d\t%s\t%s\t%s\t%f\t%f\n", stu.num, stu.name, stu.clas, stu.sex, stu.Eng_score, stu.C_score); //打印输出
//......
}