C语言文件操作这一块的几个问题 求解决
我先简单的说明一下问题我写了一个学生管理系统 其中 有 添加 , 删除 ,查看所有学生 这几个功能
我想把所有数据保存到二进制文件当中
我先是定义了一个学生信息的结构体
然后我声明了一个结构体数组 stu[LEN];
1. 添加功能 我以追加(ab) 的形式打开了二进制文件 然后遇到一个问题 我使用追加的话 我再输出时发现 前面有一个空的结构体信息 而我所添加的学生信息 都从第二行开始显示 第一行的值是 0 这可能是因为我以追加的形式打开了文件 那么我如何解决这个问题 因为我添加学生的时候 我要追加到后面
2 看所有学生功能
首先我添加完之后 比如我添加了N个学生 我想用for循环 将其全部读取到一个结构体中 然后将其输出 那么我如何确定我要读取多少个 也就是for循环走几次 因为我只想读取学生的信息 如果我使用LEN 的话 for会走 LEN 次 会读出一些空值
3. 删除功能
这个功能我是这样想的 把文件中的数据 全部读到一个结构体数组中 然后用for循环删除这个数组中的某一学生 然后再将这个数组中的数据全部写入到二进制文件中
但是这个过程中 我想直接把文件中原本的信息覆盖了 具体该怎么做 求指点
下面是源代码 求指点
头文件
struct student{
char name[20];
int age;
char xingbie[20];
char address[100];
int chengji;
int jifen;
};
struct student stu[LEN];
struct student stu1[LEN];
struct student stu2[LEN];
功能文件
#include "tou.h"
void tianjia(struct student stu[]){
FILE *fp;
int i;
char ch;
for(i=0;i<LEN;i++){
p=i;
printf("请输入学生的姓名\n");
scanf("%s",stu[i].name);
fflush(stdin);
printf("请输入学生的年龄\n");
scanf("%d",&stu[i].age);
fflush(stdin);
printf("请输入学生的性别\n");
scanf("%s",stu[i].xingbie);
fflush(stdin);
printf("请输入学生住址\n");
scanf("%s",stu[i].address);
fflush(stdin);
printf("请输入学生的成绩\n");
scanf("%d",&stu[i].chengji);
fflush(stdin);
printf("请输入学生的积分\n");
scanf("%d",&stu[i].jifen);
fflush(stdin);
fp=fopen("学生数据","ab+");
if(fp==NULL){
printf("文件操作失败");
}
rewind(fp);
fwrite(&stu[i],sizeof(struct student),1,fp);
fclose(fp);
printf("是否继续添加(y/n)\n");
fflush(stdin);
ch=getchar();
if(ch=='n'||ch=='N'){
break;
}
}
printf("\n");
printf(" _按回车键返回主菜单!\n");
getchar();
}
void chakan(struct student stu1[]){
int i=0;
FILE *fp;
fp=fopen("学生数据","rb");
if(fp==NULL){
printf("文件操作失败\n");
return;
}
rewind(fp); //重置文件指针位置
for(i=0;i<5;i++){
fread(&stu1[i],sizeof(struct student),1,fp);
}
AA;
for(i=0;i<5;i++){
BB;
}
printf("\n");
printf(" _按回车键返回主菜单!\n");
getchar();
fclose(fp);
}
void chazhao(struct student stu1[]){
int i,a=0;
FILE *fp;
char ch[20];
fp=fopen("学生数据","rb");
if(fp==NULL){
printf("操作失败\n");
}
for(i=0;i<LEN;i++){
fread(&stu1[i],sizeof(struct student),1,fp);
}
printf("请输入要查找的学生姓名\n");
scanf("%s",&ch);
for(i=0;i<LEN;i++){
if(strcmp(ch,stu1[i].name)==0){
AA;
BB;
getchar();
break;
}else{
a++;
}
}
if(a==LEN){
printf("未找到!\n");
}
fclose(fp);
printf("\n");
printf(" _按回车键返回主菜单!\n");
getchar();
}
void shanchu(struct student stu2[]){
int i,j,a=0;
FILE *fp;
char ch[20];
fp=fopen("学生数据","ab+");
if(fp==NULL){
printf("操作失败\n");
}
rewind(fp);
for(i=0;i<LEN;i++){
fread(&stu2[i],sizeof(struct student),1,fp);
}
printf("请输入你要删除的学生姓名\n");
scanf("%s",ch);
for(i=0;i<LEN;i++){
if(strcmp(ch,stu2[i].name)==0){
for(j=0;j<LEN;j++){
stu2[j]=stu2[j+1];
}
}
}
rewind(fp);
fwrite(&stu2[i],sizeof(struct student),1,fp);
fclose(fp);
for(i=0;i<LEN;i++){
printf("\t%s\t%d\t%s\t%s\t%d\t%d\n",stu2[i].name,stu2[i].age,stu2[i].xingbie,stu2[i].address,stu2[i].chengji,stu2[i].jifen);
}
printf("\n");
printf(" _按回车键返回主菜单!\n");
fflush(stdin);
getchar();
}