可以运行,但是达不到目的,不会修改
程序代码:
typedef struct /* 学生结构 /
{
short status; / 数据状态,0:正常 1:删除 /
char number[10]; / 学号 /
char name[20]; / 姓名 /
char sex[3]; / 性别 /
int age; / 年龄 /
char place; / 籍贯 /
char department; / 系别 /
char major; / 专业 /
int classnumber; / 班级 */
}StudentType;
void AddData(void); /* 增加数据 /
void ChangeData(void); / 修改数据 /
void SearchData(void); / 查找数据 /
void ListData(void); / 显示数据 /
void PackData(void); / 删除数据 */
#include /* 标准输入输出文件包含预处理命令 /
#include / 字符串文件含预处理命令 /
#include / 包含tolower()的原型 /
#include / 标准库文件包含预处理命令 */
FILE*fp; /* 声明文件指针 */
void AddData(void) /* 增加文件数据 /
{
StudentType student; / 学生 /
char tag; / 设置标志是否继续增加 /
student.status=0; / 数据状态,0:正常 1:删除 /
do
{
printf("学生学号:");
scanf("%s,student.number"); / 输入学号 /
printf("学生姓名:");
scanf("%s,student.name"); / 输入姓名 /
printf("学生性别:");
scanf("%s,student.sex"); / 输入性别 /
printf("学生年龄:");
scanf("%d,student.age"); / 输入年龄 /
printf("学生籍贯:");
scanf("%s,student.place"); / 输入籍贯 /
printf("学生系别");
scanf("%s,student.department"); / 输入系别 /
printf("学生专业:");
scanf("%s,student.major"); /输入专业 /
printf("学生班级:");
scanf("%d,student.classnumber"); / 输入班级 */
fseek(fp,0, SEEK_END); /* 移动文件内部指针 /
fwrite(&student,sizeof(StudentType),1,fp); / 将图书信息存入文件中 /
printf("继续添加吗(y/n):");
while (getchar() !='\n'); / 跳过当前行 /
tag=getchar(); / y,Y表示继续,N,n表示结束 /
tag=tolower(tag); / 大写字母转化为小写字母 /
while (tag !='y' && tag !='n')
{ / 非法输入时重新输入 /
printf("输入非法,重新输入(y/n):");
while (getchar() !='\n'); / 跳过当前行 /
tag=getchar(); / y,Y表示继续,N,n表示结束 /
tag=tolower(tag); / 大写字母转化为小写字母 */
}
}while (tag=='y'); /* 肯定回答时循环 */
}
void ChangeData(void) /* 更新数据 /
{
StudentType student; / 学生 /
char number[20]; / 学生学号 /
printf("输入要更改的学生学号:");
scanf("%s",number); / 输入学生学号 /
rewind(fp); / 使位置指针返回到文件开头 /
fread(&student,sizeof(StudentType),1,fp); / 读入学生信息 */
while(!feof(fp))
{ /* 文件未结束 */
if(strcmp(student.number,number)==0 /* 学生学号相同 */
&& student.status==0 /* 数据状态正常,未作删除标志 */
)break; /* 查询成功 */
fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */
}
if (!feof(fp))
{ /* 查询成功 */
printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n","学生学号","学生姓名","学生性别","学生年龄","学生籍贯","学生系别","学生专业","学生班级");
printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n",
/* 输出信息 */
student.number,student.name,student.sex,student.age,student.place,student.department,student.major,student.classnumber);
printf("输入更改后的数据:\n");
printf("学生学号:");
scanf("%s,student.number"); /* 输入学号 /
printf("学生姓名:");
scanf("%s,student.name"); / 输入姓名 /
printf("学生性别:");
scanf("%s,student.sex"); / 输入性别 /
printf("学生年龄:");
scanf("%d,student.age"); / 输入年龄 /
printf("学生籍贯:");
scanf("%s,student.place"); / 输入籍贯 /
printf("学生系别");
scanf("%s,student.department"); / 输入系别 /
printf("学生专业:");
scanf("%s,student.major"); /输入专业 /
printf("学生班级:");
scanf("%d,student.classnumber"); / 输入班级
fseek(fp,-sizeof(StudentType), SEEK_CUR); /* 移动文件内部指针 /
fwrite(&student, sizeof(StudentType),1,fp); / 写入数据 /
}
else
{ / 查询失败 /
printf("无此编号的学生!\n");
clearerr(fp); / 清除文件结束标志 */
}
}
void SearchData(void)
{
StudentType student; /* 查询数据 /
int select; / 工作变量 /
char number[20]; / 学号 /
char major[20]; / 专业 */
printf("请选择:\n");
printf("1.按学号查询 2.按专业查询\n");
scanf("%d",&select); /* 输入选择 /
while (select2)
{
printf("请输入1~2的数:"); / 输入提示 /
scanf("%d,&select"); / 输入选择 */
}
switch (select)
{
case 1: /* 按学生学号查询 /
printf("请输入要查询的学生学号:");
scanf("%s",number); / 输入学生的学号 /
rewind(fp); / 使指针位置返回到文件的开头 /
fread(&student,sizeof(StudentType),1,fp); / 读入学生信息 /
while (!feof(fp))
{ / 文件未结束 /
if(strcmp(student.number,number)==0 / 学生学号相同 /
&& student.status==0 / 数据状态正常,没有删除标志 /
)break; / 查询成功 /
fread(&student,sizeof(StudentType),1,fp); / 读入学生信息 /
}
break;
case 2:
printf("输入要查询的学生的专业:"); / 按专业查询 /
scanf("%s",major); / 输入学生专业 /
rewind(fp); / 使指针返回文件的开头 /
fread(&student,sizeof(StudentType),1,fp); / 读入学生的信息 /
while(!feof(fp))
{ / 文件未结束 /
if (strcmp(student.major,major)==0 / 学生专业相同 /
&& student.status==0 / 数据状态正常,没有删除标志 /
) break; / 查询成功 /
fread(&student,sizeof(StudentType),1,fp); / 读入学生信息 /
}
break;
}
if (!feof(fp))
{ / 查询成功 /
printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n","学生学号","学生姓名","学生性别","学生年龄","学生籍贯","学生系别","学生专业","学生班级");
printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n",
/ 输出信息 /
student.number,student.name,student.sex,student.age,student.place,student.department,student.major,student.classnumber);
}
else
{ / 查询失败 /
printf("无此专业的学生!\n");
clearerr(fp); / 清除文件结束标志 */
}
}
void DeleteData(void) /* 删除数据,只作删除标志 /
{
StudentType student; / 学生 /
char number[20]; / 学生学号 /
printf("输入要更新的学生的学号:");
scanf("%s", number); / 输入学生的学号 /
rewind(fp); / 使位置指针返回文件的开头 /
fread(&student, sizeof(StudentType),1,fp); / 读入学生的信息 /
while(!feof(fp))
{ / 文件未结束 /
if (strcmp(student.number, number)==0 / 学生的学号相同 /
&& student.status==0 / 数据状态正常,未作删除标志 /
)break; / 查询成功 /
fread(&student,sizeof(StudentType),1,fp); / 读入学生信息 /
}
if(!feof(fp))
{ / 查询成功 /
printf("被删除记录为:、n");
printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n","学生学号","学生姓名","学生性别","学生年龄","学生籍贯","学生系别","学生专业","学生班级");
printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n",
/ 输出信息 /
student.number,student.name,student.sex,student.age,student.place,student.department,student.major,student.classnumber);
student.status=1;
fseek(fp,-sizeof(StudentType), SEEK_CUR); / 移动文件内部指针 /
fwrite(&student, sizeof(StudentType),1,fp); / 写入数据 /
}
else
{ / 查询失败 /
printf("无此编号的学生!\n");
clearerr(fp); / 清除文件结束标志 */
}
}
void pack(void) /* 在物理上删除作有删除标记的记录 /
{
StudentType student; / 学生 /
FILE*fpTmp; / 临时文件指针 /
if ((fpTmp=fopen("book_tmp.dat","wb"))==NULL)
{ / 打开文件失败 /
printf("打开文件student_tmp.dat 失败!\n"); / 错误信息 /
system("PAUSE"); / 调用库函数system(),输出系统提示信息 /
exit(2); / 退出程序 */
}
rewind(fp); /* 使位置指针返回文件开头 */
fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */
while (!feof(fp))
{ /* 文件未结束 */
if(student.status==0) /*数据状态正常,未作删除标志 */
fwrite(&student,sizeof(StudentType),1,fpTmp); /* 写入数据 */
fread(&student,sizeof(StudentType),1,fp); /* 继续读入图书信息 */
}
fclose(fp); fclose(fpTmp); /* 关闭文件 */
remove("student.dat"); /* 删除文件 */
rename("&student_tmp.dat","student.dat"); /* 更改文件名 */
if ((fp=fopen("student.dat","rb+"))==NULL)
{ /* 打开 employee.dat失败 */
printf("打开文件student.dat 失败!\n"); /* 错误信息 */
system("PAUSE"); /* 调用库函数system(),输出系统提示信息 */
exit(3); /* 退出程序 */
}
}
#include /* 标准输入输出文件包含预处理命令 /
#include / 标准库文件包含预处理命令 */
FILE*fp; /* 定义文件指针 */
int main(void) /* 主函数main() /
{
int select; / 工作变量 */
if ((fp=fopen("student.dat","rb+"))==NULL)
{ /* student.dat 文件不存在 */
if ((fp=fopen("student.dat","wb+"))==NULL)
{ /* 打开文件失败 */
printf("打开文件student.dat失败!\n"); /* 错误信息 */
system("PAUSE"); /* 调用库函数system(),输出系统提示信息 */
exit(1); /* 退出程序 */
}
}
do
{
printf("\n请选择:\n");
printf("1.增加数据 2.修改数据 3.查找数据 4.删除数据 5.重组数据 6.退出\n");
scanf("%d",&select); /* 输入选择 /
while (select6)
{
printf("请输入1~6的数:"); / 输入提示 /
scanf("%d",&select); / 输入选择 */
}
switch(select)
{
case 1:
AddData(); /* 增加数据 /
break;
case 2:
ChangeData(); / 修改数据 */
break;
case 3:
SearchData(); /* 查询数据 /
break;
case 4:
DeleteData(); / 删除数据,只作删除标志 /
break;
case 5:
pack(); / 物理上删除作有标记的记录 /
break;
}
}while (select!=6); / 选择6退出循环 */
fclose(fp); /* 关闭文件 */
system("PAUSE"); /* 调用库函数system(),输出系统提示信息 /
return 0; / 返回值0,返回操作系统 */
}