fflush
是 C 语言标准库中的一个函数,它用于清空输出缓冲区或输入缓冲区,强制将缓冲区内的数据立即写入文件或输出流。这个函数通常用于确保数据已经从程序传输到目的地,而不是仍然留在内存中的缓冲区。
函数原型:
int fflush(FILE *stream);
参数:
stream
:指向FILE
对象的指针,该FILE
对象代表一个打开的文件流。
返回值:
- 成功时,返回
0
。 - 失败时,返回
EOF
(End Of File)并设置errno
以指示错误原因。
使用场景:
1、输出缓冲区清空:当你使用 printf
或其他输出函数写入文件或终端时,数据可能不会立即写入目标,而是暂时存储在缓冲区中。如果你希望在程序继续执行之前确保数据已经被写入,可以使用 fflush
。
FILE *fp = fopen("output.txt", "w");
if (fp != NULL) {
fprintf(fp, "Hello, World!");
fflush(fp); // 确保 "Hello, World!" 被写入文件
fclose(fp);
}
2、输入缓冲区清空:fflush
也可以用于清空输入缓冲区,这在某些情况下可能有助于移除未处理的输入数据。
int c;
printf("Press Enter to continue...\n");
while ((c = getchar()) != '\n' && c != EOF) {
; // 忽略输入
}
fflush(stdin); // 清空输入缓冲区
注意事项:
fflush
只对输出流(如文件和终端输出)有效。对于输入流(如键盘输入),fflush
的行为是未定义的,但可以尝试用于清空输入缓冲区。- 如果在网络编程中使用
fflush
,请注意它只确保数据被发送到 TCP 缓冲区,并不保证数据已经被对方接收。 - 在某些情况下,
fflush
可能会导致性能问题,因为它减少了缓冲操作的效率。因此,应当在确实需要时才使用fflush
。 - 使用
fflush
清空输入缓冲区(fflush(stdin)
)在不同的系统和编译器中行为可能不一致。在某些系统上,这可能导致未定义的行为或错误。在 C11 标准中,fflush
对于输入流是不允许的。
fflush
是一个有用的工具,可以帮助你控制数据的流动和确保数据的及时写入。然而,应当谨慎使用,以避免不必要的性能损失。