C 语言中文件操作函数需要注意的一点事项

总计 437 阅读, 今天 3 阅读

不久前,帮同学的同学写了一个大作业,里面用到了文件操作。
本来以为简简单单轻松愉快,加几行代码就能搞定的文件操作,坑倒不少。
先贴代码片段。

printf("正在检索书库……\n");
FILE *fp = fopen("books.txt", "a+");
while (!feof(fp))//stop when reach end of file
{
    fscanf(fp, "%s %s %s %d-%d-%d %d %d %d", store[i].name, store[i].author, store[i].press, &store[i].release.yyyy, &store[i].release.mm, &store[i].release.dd, &store[i].qty, &store[i].price, &store[i].index);
    i++;
}
if (i == 1)
{
    i--;
}//correct the index value for adding operation when running for the first time
opno = 1;//initialize value
printf("准备完成,开始导入书籍\n");
while (opno == 1)//validate input
{
    printf("请依次输入书名、作者、出版社、出版日期(格式 yyyy-mm-dd)、数量、价格,以空格分隔:\n");
    scanf("%s %s %s %d-%d-%d %d %d", store[i].name, store[i].author, store[i].press, &store[i].release.yyyy, &store[i].release.mm, &store[i].release.dd, &store[i].qty, &store[i].price);
    store[i].index = i + 1;
    fprintf(fp, "%s %s %s %d-%d-%d %d %d %d\n", store[i].name, store[i].author, store[i].press, store[i].release.yyyy, store[i].release.mm, store[i].release.dd, store[i].qty, store[i].price, store[i].index);
    i++;
    printf("导入成功,输入 1 继续导入,输入其他数字退出,回车键确认\n");
    scanf("%d", &opno);
}
fclose(fp);

这段代码本身是没有问题的,但是我调试的时候经常会直接 Ctrl+C 强退掉,这就出现了一个大问题。

我每次调试完 Ctrl+C 掉程序之后,Notepad++ 提示我文件被其他程序修改(因为用了 a+ ,也就是追加模式打开文件),但文件内容却没有任何变化。
在网上找了很多,也没有一个很靠谱的解决,大部分在说刷新缓冲区之类的,大家都是抄来抄去的文章,也没啥看头。
但说到了缓冲区啊,于是我就研究了一下,发现:
C 语言的文件操作,在打开句柄之后是将所有操作存在缓冲区里的,也就是内存里。
要真正写入文件,需要关闭文件操作句柄,即执行

fclose(fp);

这时候所有的文件修改才真正被保存到实际的文件里。
啊,问题解决,我还以为我代码写错了。

发表评论

邮箱地址不会被公开。 必填项已用*标注

 

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据