刷新(fflush)

fflush函数用于清空输出缓冲区,将缓冲区中的数据强制写入到目标文件或设备。其主要用途和特性如下:

1. 语法

int fflush(FILE *stream);

2. 参数

  • stream:指向FILE对象的指针,代表要刷新的输出流。如果参数为NULL,则会刷新所有输出流的缓冲区。

3. 返回值

  • 成功时返回0,失败时返回EOF,并设置errno以指示错误原因。

4. 使用场景

  • 输出到终端:在终端程序中,确保输出立即显示,而不是等待缓冲区满。

  • 文件写入:在进行文件操作时,确保数据在程序崩溃或异常退出前被写入文件。

  • 交互式程序:在需要及时响应用户输入时,确保输出内容可见。

5. 注意事项

  • 对于输入流,调用fflush是未定义的行为,通常不推荐使用。

  • 使用fflush时要小心,频繁调用可能影响性能,因为它会导致I/O操作。

示例代码

#include <stdio.h>

int main() {
    printf("Hello, World!");
    fflush(stdout); // 确保内容立即输出到终端

    FILE *file = fopen("output.txt", "w");
    if (file) {
        fprintf(file, "Writing to file...\n");
        fflush(file); // 强制写入文件
        fclose(file);
    }

    return 0;
}

在这个示例中,fflush(stdout)确保printf的输出立即可见,而fflush(file)确保数据写入到文件。

详细使用场景

  1. 缓冲区行为

    • 默认情况下,标准输出(如stdout)通常是行缓冲的,这意味着在输出换行符时,缓冲区会被刷新。使用fflush(stdout)可以手动刷新,即使没有换行符。

  2. 文件操作

    • 在写入文件时,尤其是在进行多次写入后,使用fflush可以确保数据立即写入文件,而不是等待缓冲区满或文件关闭时才写入。

  3. 网络编程

    • 在网络编程中,确保数据被及时发送到网络套接字,可以使用fflush

代码示例

例子 1:行缓冲和手动刷新

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("Waiting for input...\n");
    fflush(stdout); // 强制输出到终端

    // 等待用户输入
    sleep(5); // 模拟等待
    printf("Input received!\n");

    return 0;
}

在这个例子中,fflush(stdout)确保“Waiting for input...”在等待用户输入之前立即输出。

例子 2:文件写入

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");
    if (file) {
        fprintf(file, "First line.\n");
        fflush(file); // 立即写入文件

        fprintf(file, "Second line.\n");
        fflush(file); // 再次立即写入
        fclose(file);
    } else {
        perror("Error opening file");
    }
    return 0;
}

这里,fflush(file)确保每次写入后数据立即写入到example.txt

注意事项

  • 使用fflush时要避免对输入流(如stdin)调用,它会导致未定义行为。

  • 频繁调用fflush可能影响程序性能,因此在需要时合理使用。

Last updated