#include <stdio.h>
#include <string.h>
#include<stdlib.h>
struct Student
{
int num;
char name[20];
int age;
char sex;
struct birth
{
int year;
int month;
int day;
} birthday;
char address[50];
char tel[12];
char Email[20];
} stu,stu1,stu2;
int static k=-1;
void insert(struct Student *stu,int N)
{
int i;
printf("请根据提示按照格式录入信息!\n");
printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
for(i=0; i<N; i++)
scanf("%d%s%d%s%d%d%d%s%s%s",&stu[i].num,stu[i].name,&stu[i].age,&stu[i].sex,&stu[i].birthday.year,&stu[i].birthday.month,&stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
system("pause");
}
void disp(struct Student *stu,int N)
{
int i;
for(i=0; i<N; i++)
printf("%d %s %d %c %d %d %d %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
system("pause");
}
void find(struct Student *stu,int N)
{
int i,n,flag=0,xh;
char name[20];
printf("请输入想要查询的方式:1 :按学号查找 2:按姓名查找\n");
scanf("%d",&n);
if(n==1)
{
printf("请输入要查找的学号:");
scanf("%d",&xh);
for(i=0; i<N; i++)
if(xh==stu[i].num)
{
flag = 1;
printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
printf("--------------------------------------------------------------------\n");
printf("%d %s %d %c %d %d %d %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
}
if (0 == flag)
printf("该学号不存在!\n");
}
else if(n==2)
{
printf("请输入要查找的姓名:");
scanf("%s",name);
for(i=0; i<N; i++)
if(strcmp(name,stu[i].name)==0)
{
flag = 1;
printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
printf("--------------------------------------------------------------------\n");
printf("%d %s %d %c %d %d %d %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
}
if (0 == flag)
printf("该姓名不存在!\n");
}
else
printf("NULL!");
system("pause");
}
void modify( struct Student *stu,int N)
{
int i, choice, num=-1,xh,flag=0;
int year,month,day;
char sex, name[20],tel[20], add[20],mail[20];
printf("请输入要要修改的学生的学号:\n");
scanf("%d", &xh);
for (i=0;i<N;i++)
{
num=i;
if (stu[i].num==xh)
{
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改年龄\n");
printf("3.修改性别\n");
printf("4.修改出生年份\n");
printf("5.修改出生月份\n");
printf("6.修改出生日\n");
printf("7.修改地址\n");
printf("8.修改电话号码\n");
printf("9.修改邮箱\n");
printf("10.修改完成!\n");
while (flag==0)
{
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s", name);
strcpy(stu[num].name, name);
break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d", &stu[num].age);
break;
case 3:
printf("请输入新的性别:\n");
fflush(stdin);
scanf("%c", &sex);
stu[i].sex = sex;
break;
case 4:
printf("请输入新的出生年份:\n");
scanf("%d", &year);
stu[num].birthday.year = year;
break;
case 5:
printf("请输入新的出生月份:\n");
scanf("%d", &month);
stu[num].birthday.month = month;
break;
case 6:
printf("请输入新的出生日:\n");
scanf("%d", &day);
stu[num].birthday.day = day;
break;
case 7:
printf("请输入新的地址:\n");
scanf("%s", &add);
strcpy(stu[num].address, add);
break;
case 8:
printf("请输入新的电话号码:\n");
scanf("%s", &tel);
strcpy(stu[num].tel, tel);
break;
case 9:
printf("请输入新的邮箱:\n");
scanf("%s", &mail);
strcpy(stu[num].Email, mail);
break;
case 10:
flag=1;
default:
printf("请在1-9之间选择\n");
}
//2getchar();
}
printf("修改完毕!请及时保存!\n");
}
}
system("pause");
}
void del(struct Student *stu,struct Student *stu1,int *N)
{
FILE *fp1;
fp1=fopen("d:\\ccccc\\stu1.txt","a+");
int i,j,flag=0,xh;
char s1[20];
printf("请输入要删除学生的学号:\n");
scanf("%d", &xh);
for (i = 0; i <*N; i++)
{
if (xh==stu[i].num)
{
k++;
stu1[k]=stu[i];
fprintf(fp1,"%d %s %d %c %d %d %d %s %s %s\n",stu1[k].num,stu1[k].name,stu1[k].age,stu1[k].sex,stu1[k].birthday.year,stu1[k].birthday.month,stu1[k].birthday.day,stu1[k].address,stu1[k].tel,stu1[k].Email);
fclose(fp1);
flag = 1;
for (j = i; j <(*N); j++)
{
stu[j] = stu[j + 1];
}
break;
}
}
if (flag==0)
{
printf("该学号不存在!\n");
}
if (flag==1)
{
printf("成功将该学生信息删除,并保留在stu1文档中!\n");
(*N)--;
}
system("pause");
}
void add(struct Student *stu,int *N)
{
int i,m,j,flag,k;
k=(*N);
printf("请输入待增加的学生数:\n");
scanf("%d", &m);
for(i=0; i<m; i++)
{
printf("请依次输入第%d位同学的信息:\n",k+1);
printf("学生学号 学生姓名 年龄 性别 出生年份 出生月份 出生日 地址 电话号码 邮箱\n");
scanf("%d%s%d%s%d%d%d%s%s%s",&stu[(*N)+i].num,stu[(*N)+i].name,&stu[(*N)+i].age,&stu[(*N)+i].sex,&stu[(*N)+i].birthday.year,&stu[(*N)+i].birthday.month,&stu[(*N)+i].birthday.day,stu[(*N)+i].address,stu[(*N)+i].tel,stu[(*N)+i].Email);
k++;
}
printf("学生信息添加成功!\n");
(*N)=(*N)+m;
system("pause");
}
void writeintofile(struct Student *stu,int N)
{
FILE *fp;
fp=fopen("d:\\ccccc\\stu.txt","a+");
for(int i=0; i<N; i++)
fprintf(fp,"%d %s %d %c %d %d %d %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
fclose(fp);
printf("成功将学生信息写入文件stu中!\n");
system("pause");
}
void read (struct Student *stu2,int *N)
{
int i,j;
int count=0;
int sumrow;
FILE *fp;
fp=fopen("d:\\ccccc\\stu.txt","r");
if(fp==NULL)
{
printf("File cannot open! " );
}
while(!feof(fp))
{
count++;
}
sumrow = count+1;
(*N)=(*N)+sumrow;
printf("文件行数为:%d",sumrow);
printf("\n");
for(i=0;i<sumrow;i++)
fscanf(fp,"%[^\n]%d%s%d%s%d%d%d%s%s%s",&stu2[i].num,stu2[i].name,&stu2[i].age,&stu2[i].sex,&stu2[i].birthday.year,&stu2[i].birthday.month,&stu2[i].birthday.day,stu2[i].address,stu2[i].tel,stu2[i].Email);
printf("文件内容为\n");
for (i=0;i<sumrow;i++)
printf("%d %s %d %c %d %d %d %s %s %s\n",stu2[i].num,stu2[i].name,stu2[i].age,stu2[i].sex,stu2[i].birthday.year,stu2[i].birthday.month,stu2[i].birthday.day,stu2[i].address,stu2[i].tel,stu2[i].Email);
fclose(fp);
}
int main()
{
int num,flag=1,N;
printf("请输入要录入的学生信息个数\n");
scanf("%d",&N);
struct Student stu[1000];
struct Student stu1[1000];
struct Student stu2[1000];
printf(" 学生信息管理系统 \n");
printf("******************* 功能菜单 ********************\n");
printf(" ---------------------- ---------------------- \n");
printf(" 1.录入学生信息 2.浏览当前信息 \n");
printf(" ********************************************* \n");
printf(" * 3.查询学生信息 4.修改学生信息 \n");
printf(" ********************************************* \n");
printf(" * 5.删除学生信息 6 增添学生信息 \n");
printf(" ********************** ********************** \n");
printf(" *7.将信息写入文件中 8.退出程序 \n");
printf(" ---------------------- ---------------------- \n");
while (flag!=0)
{
printf("请选择想要完成的功能:\n");
scanf("%d", &num);
switch (num)
{
case 1:
insert(stu,N);
break;
case 2:
disp(stu,N);
break;
case 3:
find(stu,N);
break;
case 4:
modify(stu, N);
break;
case 5:
del(stu,stu1, &N);
break;
case 6:
add(stu,&N);
break;
case 7:
writeintofile(stu,N);
break;
case 8:
read(stu2,N);
break;
case 9:
flag=0;
printf("即将退出程序!");
}
}
return 0;
}
文件读入修改如下,修改处见注释。删除函数void del(struct Student *stu,struct Student *stu1,int *N)里面有对文件的操作,感觉不是很妥当,没做修改这里提醒下。供参考:
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
struct Student
{
int num;
char name[20];
int age;
char sex;
struct birth
{
int year;
int month;
int day;
} birthday;
char address[50];
char tel[12];
char Email[20];
}; //stu,stu1,stu2; 这里定义的多余
int static k=-1;
void insert(struct Student *stu,int N)
{
int i;
printf("请根据提示按照格式录入信息!\n");
printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
for(i=0; i<N; i++)
scanf("%d%s%d%s%d%d%d%s%s%s",
&stu[i].num,stu[i].name,&stu[i].age,&stu[i].sex,&stu[i].birthday.year,
&stu[i].birthday.month,&stu[i].birthday.day,stu[i].address,stu[i].tel,
stu[i].Email);
system("pause");
}
void disp(struct Student *stu,int N)
{
int i;
for(i=0; i<N; i++)
printf("%d %s %d %c %d %d %d %s %s %s\n",
stu[i].num,stu[i].name,stu[i].age,stu[i].sex,
stu[i].birthday.year,stu[i].birthday.month,
stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
system("pause");
}
void find(struct Student *stu,int N)
{
int i,n,flag=0,xh;
char name[20];
printf("请输入想要查询的方式:1 :按学号查找 2:按姓名查找\n");
scanf("%d",&n);
if(n==1)
{
printf("请输入要查找的学号:");
scanf("%d",&xh);
for(i=0; i<N; i++)
if(xh==stu[i].num)
{
flag = 1;
printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
printf("--------------------------------------------------------------------\n");
printf("%d %s %d %c %d %d %d %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,
stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,
stu[i].address,stu[i].tel,stu[i].Email);
}
if (0 == flag)
printf("该学号不存在!\n");
}
else if(n==2)
{
printf("请输入要查找的姓名:");
scanf("%s",name);
for(i=0; i<N; i++)
if(strcmp(name,stu[i].name)==0)
{
flag = 1;
printf("学生学号\t学生姓名\t年龄\t性别\t出生年份\t出生月份\t出生日\t地址\t电话号码\t邮箱\n");
printf("--------------------------------------------------------------------\n");
printf("%d %s %d %c %d %d %d %s %s %s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,
stu[i].birthday.year,stu[i].birthday.month,
stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
}
if (0 == flag)
printf("该姓名不存在!\n");
}
else
printf("NULL!");
system("pause");
}
void modify( struct Student *stu,int N)
{
int i, choice, num=-1,xh,flag=0;
int year,month,day;
char sex, name[20],tel[20], add[20],mail[20];
printf("请输入要要修改的学生的学号:\n");
scanf("%d", &xh);
for (i=0;i<N;i++)
{
num=i;
if (stu[i].num==xh)
{
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改年龄\n");
printf("3.修改性别\n");
printf("4.修改出生年份\n");
printf("5.修改出生月份\n");
printf("6.修改出生日\n");
printf("7.修改地址\n");
printf("8.修改电话号码\n");
printf("9.修改邮箱\n");
printf("10.修改完成!\n");
while (flag==0)
{
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入新的姓名:\n");
scanf("%s", name);
strcpy(stu[num].name, name);
break;
case 2:
printf("请输入新的年龄:\n");
scanf("%d", &stu[num].age);
break;
case 3:
printf("请输入新的性别:\n");
fflush(stdin);
scanf("%c", &sex);
stu[i].sex = sex;
break;
case 4:
printf("请输入新的出生年份:\n");
scanf("%d", &year);
stu[num].birthday.year = year;
break;
case 5:
printf("请输入新的出生月份:\n");
scanf("%d", &month);
stu[num].birthday.month = month;
break;
case 6:
printf("请输入新的出生日:\n");
scanf("%d", &day);
stu[num].birthday.day = day;
break;
case 7:
printf("请输入新的地址:\n");
scanf("%s", &add);
strcpy(stu[num].address, add);
break;
case 8:
printf("请输入新的电话号码:\n");
scanf("%s", &tel);
strcpy(stu[num].tel, tel);
break;
case 9:
printf("请输入新的邮箱:\n");
scanf("%s", &mail);
strcpy(stu[num].Email, mail);
break;
case 10:
flag=1;
default:
printf("请在1-9之间选择\n");
}
//2getchar();
}
printf("修改完毕!请及时保存!\n");
}
}
system("pause");
}
void del(struct Student *stu,struct Student *stu1,int *N)
{
FILE *fp1;
fp1=fopen("d:\\ccccc\\stu1.txt","a+");
int i,j,flag=0,xh;
char s1[20];
printf("请输入要删除学生的学号:\n");
scanf("%d", &xh);
for (i = 0; i <*N; i++)
{
if (xh==stu[i].num)
{
k++;
stu1[k]=stu[i];
fprintf(fp1,"%d %s %d %c %d %d %d %s %s %s\n",
stu1[k].num,stu1[k].name,stu1[k].age,stu1[k].sex,
stu1[k].birthday.year,stu1[k].birthday.month,stu1[k].birthday.day,
stu1[k].address,stu1[k].tel,stu1[k].Email);
fclose(fp1);
flag = 1;
for (j = i; j <(*N); j++)
{
stu[j] = stu[j + 1];
}
break;
}
}
if (flag==0)
{
printf("该学号不存在!\n");
}
if (flag==1)
{
printf("成功将该学生信息删除,并保留在stu1文档中!\n");
(*N)--;
}
system("pause");
}
void add(struct Student *stu,int *N)
{
int i,m,j,flag,k;
k=(*N);
printf("请输入待增加的学生数:\n");
scanf("%d", &m);
for(i=0; i<m; i++)
{
printf("请依次输入第%d位同学的信息:\n",k+1);
printf("学生学号 学生姓名 年龄 性别 出生年份 出生月份 出生日 地址 电话号码 邮箱\n");
scanf("%d%s%d%s%d%d%d%s%s%s",
&stu[(*N)+i].num,stu[(*N)+i].name,&stu[(*N)+i].age,&stu[(*N)+i].sex,
&stu[(*N)+i].birthday.year,&stu[(*N)+i].birthday.month,&stu[(*N)+i].birthday.day,
stu[(*N)+i].address,stu[(*N)+i].tel,stu[(*N)+i].Email);
k++;
}
printf("学生信息添加成功!\n");
(*N)=(*N)+m;
system("pause");
}
void writeintofile(struct Student *stu,int N)
{
FILE *fp;
fp=fopen("d:\\ccccc\\stu.txt","a+");
for(int i=0; i<N; i++)
fprintf(fp,"%d %s %d %c %d %d %d %s %s %s\n",
stu[i].num,stu[i].name,stu[i].age,stu[i].sex,
stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,
stu[i].address,stu[i].tel,stu[i].Email);
fclose(fp);
printf("成功将学生信息写入文件stu中!\n");
system("pause");
}
void read (struct Student *stu2,int *N)
{
int i=0;
//int count=0;int sumrow;
FILE *fp;
fp=fopen("d:\\ccccc\\stu.txt","r");
if(fp==NULL)
{
printf("File cannot open! " );
return;
}
while(1) //while(!feof(fp))
{
if(fscanf(fp,"%d %s %d %c %d %d %d %s %s %s\n",
&stu2[i].num,stu2[i].name,&stu2[i].age,&stu2[i].sex,
&stu2[i].birthday.year,&stu2[i].birthday.month,&stu2[i].birthday.day,
stu2[i].address,stu2[i].tel,stu2[i].Email)!=10) break;
i++; //count++;
}
//sumrow = count+1;
(*N)=(*N)+i; //(*N)=(*N)+sumrow;
printf("文件行数为:%d",(*N));//sumrow);
printf("\n");
//for(i=0;i<sumrow;i++)
//fscanf(fp,"%[^\n]%d%s%d%s%d%d%d%s%s%s",&stu2[i].num,stu2[i].name,&stu2[i].age,&stu2[i].sex,
//&stu2[i].birthday.year,&stu2[i].birthday.month,&stu2[i].birthday.day,stu2[i].address,stu2[i].tel,stu2[i].Email);
fclose(fp);
printf("文件内容为\n");
for (i=0;i<(*N);i++)
printf("%d %s %d %c %d %d %d %s %s %s\n",
stu2[i].num,stu2[i].name,stu2[i].age,stu2[i].sex,stu2[i].birthday.year,
stu2[i].birthday.month,stu2[i].birthday.day,stu2[i].address,stu2[i].tel,stu2[i].Email);
}
int main()
{
int num,flag=1,N;
printf("请输入要录入的学生信息个数\n");
scanf("%d",&N);
struct Student stu [1000];
struct Student stu1[1000];
struct Student stu2[1000];
printf(" 学生信息管理系统 \n");
printf("******************* 功能菜单 ********************\n");
printf(" ---------------------- ---------------------- \n");
printf(" 1.录入学生信息 2.浏览当前信息 \n");
printf(" ********************** ********************** \n");
printf(" 3.查询学生信息 4.修改学生信息 \n");
printf(" ********************** ********************** \n");
printf(" 5.删除学生信息 6 增添学生信息 \n");
printf(" ********************** ********************** \n");
printf(" 7.将信息写入文件中 8.读出文件 \n");
printf(" ********************** ********************** \n");
printf(" 9.保存并退出程序 \n");
printf(" ---------------------- ---------------------- \n");
while (flag!=0)
{
printf("请选择想要完成的功能:\n");
scanf("%d", &num);
switch (num)
{
case 1:
insert(stu,N);
break;
case 2:
disp(stu,N);
break;
case 3:
find(stu,N);
break;
case 4:
modify(stu, N);
break;
case 5:
del(stu,stu1, &N);
break;
case 6:
add(stu,&N);
break;
case 7:
writeintofile(stu,N);
break;
case 8:
read(stu2,&N); //文件内容读入到stu2[] ?
break;
case 9:
writeintofile(stu,N);//退出系统前,保存到文件
flag=0;
printf("即将退出程序!");
}
}
return 0;
}
read()函数中:
while(!feof(fp))
{
count++;
}
这里fp已经移动到文件末位了,下面for循环再去读文件就读不到了,需要把fp重新移动到文件头处rewind(fp);
main函数中定义的struct Student stu[1000];跟全局变量Student stu重名了(在struct Student{}那里),同理还有stu1和stu2,全局变量那声明的stu,stu1,stu2可以删掉。
读写文件的地方,稍微改了一下,Student各元素之间使用,分割。
void writeintofile(struct Student *stu,int N)
{
FILE *fp;
fp=fopen("d:\\stu.txt","a+");
//修改1:元素之间使用,分割,别用空格
for(int i=0; i<N; i++)
fprintf(fp,"%d,%s,%d,%c,%d,%d,%d,%s,%s,%s\n",stu[i].num,stu[i].name,stu[i].age,stu[i].sex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day,stu[i].address,stu[i].tel,stu[i].Email);
fclose(fp);
printf("成功将学生信息写入文件stu中!\n");
system("pause");
}
void read (struct Student *stu2,int *N)
{
int i,j;
int count=0;
int sumrow;
FILE *fp;
fp=fopen("d:\\stu.txt","r");
if(fp==NULL)
{
printf("File cannot open! " );
}
while(!feof(fp))
{
count++;
}
rewind(fp); //修改2:需要重新把fp移动到文件头
sumrow = count+1;
(*N)=(*N)+sumrow; //???这个地方要干啥
printf("文件行数为:%d",sumrow);
printf("\n");
//修改3:元素之间使用,分割,别用空格
for(i=0;i<sumrow;i++)
fscanf(fp,"%[^\n]%d,%s,%d,%c,%d,%d,%d,%s,%s,%s",&stu2[i].num,stu2[i].name,&stu2[i].age,&stu2[i].sex,&stu2[i].birthday.year,&stu2[i].birthday.month,&stu2[i].birthday.day,stu2[i].address,stu2[i].tel,stu2[i].Email);
printf("文件内容为\n");
for (i=0;i<sumrow;i++)
printf("%d %s %d %c %d %d %d %s %s %s\n",stu2[i].num,stu2[i].name,stu2[i].age,stu2[i].sex,stu2[i].birthday.year,stu2[i].birthday.month,stu2[i].birthday.day,stu2[i].address,stu2[i].tel,stu2[i].Email);
fclose(fp);
}