6. 文件缓冲区管理

在 C 语言中使用标准库函数对文件进行操作时,为了提高函数操作的速度,标准库函数通常使用一段内存(通常称之为缓冲区)来暂存读写的数据代替真实的文件I/O操作。这样可能 带来的一个问题就是文件系统的数据可能不是应用程序操作的真实数据。数据可能会延迟。

比如在使用 printf("x"); 的时候,可能在屏幕上看不到 x 这个信息。这个因为 x 被放入到了内存中,并没有真实的写到控制台终端上。解决这个问题的方法是清空缓冲区。将缓冲区的内容同步到真实的硬件设备。

C 语言标准库中的文件缓冲区管理函数 fflush 可以让缓冲区内的数据迅速同步到硬件设备,避免数据延迟。当然频繁的调用 fflush 函数也可能致使程序的运行速度降低。

fflush 函数的声明格式如下:

函数
说明
int fflush(FILE *stream);
将写入文件流 stream 数据立即同步到目标设备。

示例:

// filename: c_fflush.c
#include <stdio.h>

int main(int argc, char * argv[]) {
    FILE * pf = NULL;  // 用于保存已经打开的文件
    int temp_value;

    pf = fopen("mydata.txt", "wb");
    if (NULL == pf) {
        perror("打开文件 mydata.txt");
        return -1;
    }
    fwrite("laowei", 1, 6, pf);
    printf("请输入一个整数让程序继续运行:\n");
     // 此时查看文件 mydata.txt 中并没有任何内容
    scanf("%d", &temp_value);
    // 调用 fflush 来清空缓存
    fflush(pf);
    // 此时在重新查看文件 mydatat.txt 发现有6个字节的内容
    printf("请查看文件 mydata.txt,然后输入一个整数让程序继续运行:\n");
    scanf("%d", &temp_value);

    // 关闭文件
    fclose(pf);

    return 0;
}

编译和运行结果如下

weimingze@mzstudio:~$ gcc -o c_fflush c_fflush.c
weimingze@mzstudio:~$ ./c_fflush
请输入一个整数让程序继续运行:
1
请查看文件 mydata.txt,然后输入一个整数让程序继续运行:
2

上述程序在输入 1 之前查看文件 mydata.txt 是没有任何内容的。在输入 1 之后再查看文件发现缓冲区的内容被写入到了文件中,可以看到 fwrite 函数写入文件的内容了。