这几天一直在写课设程序 “学生成绩信息管理系统”,主要思路是将学生信息存入链表当中,在“录入”,“修改”,“删除”操作后实际改变的是链表内容,因此需要将改变后的链表内容重新存入文件当中(文件已使用( fopen("StudentInformation,txt",“r”))打开)。
我写了一个BAO_CUN ( node *List1 )函数来进行该项操作。
首先使用 fopen ("StudentInformation.txt","w" ) 但是每次调用该函数时都只会将文件清空(说明"w”已成功执行),让已存在信息丢失,却不会再写入链表具体内容(该链表头结点名为 List,调用函数时填入 List1位置),导致形成一个新的空白文件。说明 fprintf 函数调用失败了。
该函数原代码如下:
//4:文件保存
int BAO_CUN(node *List1) //思路:将更新后的链表替代已存在链表存入文件
{
node *rear = List1->next;
FILE *fp =fopen("StudentInformation.txt","w");
if (fp == NULL)
{
printf("\n\n文件写入失败\n");
return 0;
}
else
{
while ( rear!= NULL)
{
fprintf(fp,"%lld %s %s %d %d %d %d %d %.2lf\n",rear->IDnum, rear->name, rear->sex, rear->math,rear->English,rear->physic,rear->computer,rear->sum,rear->average);
rear = rear->next;
}
return 1;
}
}
这是原文件内容:
这是调用函数后文件内容:
还注意到:两个文件的编码方式都不一样了(ANSI在 Dev 的 cmd 窗口中汉字不会乱码,UTF-8会导致乱码),目前我也没搞懂为什么。
在网上查阅了一些资料,发现需要额外加一个 fflush 函数,对文件进行缓冲,加入后发现确实可以储存了。但会导致最后几项数据丢失,应该是文件缓冲有部分数据滞留在缓冲区了,于是又加上了 fclose 函数,将文件关闭,同时缓冲区数据自动全部流出。最终数据成功保存到文件中。
改动后代码如下:
//4:文件保存
int BAO_CUN(node *List1) //思路:将更新后的链表替代已存在链表存入文件
{
node *rear = List1->next;
FILE *fp =fopen("StudentInformation.txt","w");
if (fp == NULL)
{
printf("\n\n文件写入失败\n");
return 0;
}
else
{
while ( rear!= NULL)
{
fflush(fp);
fprintf(fp,"%lld %s %s %d %d %d %d %d %.2lf\n",rear->IDnum, rear->name, rear->sex, rear->math,rear->English,rear->physic,rear->computer,rear->sum,rear->average);
rear = rear->next;
}
fclose(fp);
return 1;
}
}