#关于如何将数据储存在文件中,并对数据进行修改
首先将数据保存文件中:**
int cover_date(int *len,struct student *p)//int *len接受输入时的元素个数
{
int i;
FILE *fp;
if((fp=fopen("student.dat","wb+"))==NULL)
{
printf("open file error\n");
return -1;
}
for(i=0; i<*len; i++)
{
if(p[i].score==-1)
{
continue;
}
fprintf(fp,"%d\t%s\t%d\t%d\t%d\t%d\n",p[i].xuehao,p[i].name,p[i].Chinese,p[i].math,p[i].English,p[i].score);
}
fclose(fp);//关闭
getch();
return 0;
}
再读取文件中的数据,将其保存在定义的结构体中:
void set_student_data(int *len,struct student p[])//读取文件,并赋值给变量*len
{
FILE *fp = NULL;
int i=0;
fp = fopen("student.dat","r");
if(fp==NULL)
{
printf("文件打开失败");
}
while(!feof(fp))
{
fscanf(fp,"%d %s %d %d %d %d ",&p[i].xuehao,p[i].name,&p[i].Chinese,&p[i].math,&p[i].English,&p[i].score);
i++;
}
*len=i;//将文件中的元素个数保存在指针len中,作为其他函数的for循环次数限制
}
将读取的数据放在主函数while循环前:
int main()
{
while(1)
{
set_student_data(&actual_len,student);//每一次重新开始,变量actual_len都将获得一个新的数值。
print_student_data(student);//测试函数,打印文件数据,测试所读取的数据是否正常
此时在进行函数调用,例如:
switch(x)
{
case 1:
input(&actual_len,&student[0]);
break;
case 2:
del(&actual_len,&student[0]);
break;
case 3:
find(&actual_len,&student[0]);
break;
之后的操作,如删除、修改、等,会改变数据的函数调用则需要对文件中所保存的数据进行更新,我在这里采用了覆盖的想法重新对结构体进行重新储存,于是直接在这些函数为调用了save函数
save(len,&student[0]);//调用save函数保存对信息的修改
print_student_data(len,&p[0]);//再次打印文件中数据,查看是否删除成功
printf("学生信息删除已完成\n");
printf("按回车键继续");
getch();
}
以上便是在学生成绩管理系统编写中遇到的最大的问题,主要是对指针及结构体的运用并不熟练。在前几次失败的成品中定义的储存元素个数的指针len及数据的结构体均为空的变量,经高手指点在主函数调用了读取函数,问题才迎刃而解。
在C语言的学习中遇到的其他问题:
#C语言的错误警告1:warning: format ‘%s’ expects argument of type ‘char ', but argument 2 has type 'char ()[20]’ [-Wformat=]:格式“%s”要求参数的类型为“char*”,但参数2的类型为“char(*)[20]”[-Wformat=]
printf("\t请输姓名:");
scanf("%s",&p[i].name);//这里错误的使用了取地址符号&
p[i].name作为一个字符串变量本身就是一个地址,所以可以直接存储输入的内容,无需加&
#C语言的错误警告2:warning: implicit declaration of function ‘save’; [-Wimplicit-function-declaration]|:函数“save”的隐式声明;[-Wimplicit函数声明]|
这里只需将被调用函数移到函数前即可。
#C语言的错误3:这里也有一个让我哭笑不得的问题,读取文件时,程序总是直接结束。一直找了很久的错误,终于发现是文件打开失败,造成程序结束;高手和我都检查了很久怎么会打开失败,结果突然发现是文件名写错了!!!!!忍不住笑了!
以上问题虽小却常常忽略,还是需要提高注意