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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        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 语言的文件操作,在打开句柄之后是将所有操作存在缓冲区里的,也就是内存里。
要真正写入文件,需要关闭文件操作句柄,即执行

1
    fclose(fp);

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

views
5

发表评论

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

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