【发布时间】:2019-03-07 07:36:56
【问题描述】:
在 Ubuntu 上的人 fflush:
对于与可查找文件相关的输入流(例如,磁盘文件,但不是管道或终端),
fflush()会丢弃任何已从底层文件获取但尚未被应用程序使用的缓冲数据。
我读过一些关于fflush(stdin) 和fflush() 的问题,根据标准,输入流是未定义的行为,没错。但是特别是对于 Linux,我读过 cmets 说这不是未定义的行为,而是扩展,是的,上面的手册页说明了它将如何在文件输入流上工作。
那么,为什么fflush() 输入文件流不会丢弃 从基础文件中获取但尚未被应用程序使用的缓冲数据。 如手册页所述?
在网上搜索之前,我完全相信手册页现在我想知道它是否错了。
示例代码:
haha2.txt:123456,没有换行符或空格。
#include <stdio.h>
int
main()
{
FILE* fp = fopen("haha2.txt", "r");
int q = getc(fp);
fflush(fp);
int j = getc(fp); // I expect the rest variables to be -1(EOF) starting from here
int j2 = getc(fp);// But they can still read data as if fflush does not executed
int j3 = getc(fp);
int j4 = getc(fp);
int j5 = getc(fp);
int j6 = getc(fp);
int j7 = getc(fp);
int j8 = getc(fp);
printf("%c,%c,%c,%c,%c,%c,%c,%c\n", j,j2,j3,j4,j5,j6,j7,j8);
return(0);
}
【问题讨论】:
-
为什么你认为丢弃缓冲数据会阻止缓冲区再次被填充?
-
这种
fflush行为是特定于Linux 的。为什么不用ungetc? -
@Rick :如果在刷新时,缓冲区包含“123”(您的应用程序尚未读取),并且输入流没有发生任何其他事情,则后续读取应该填充缓冲区再次以“123 ...”开头
-
你能澄清你到底在问什么吗?您是否试图理解为什么行为与您的期望不符?或者您是否试图让行为符合您的期望?
-
我什至看不到在磁盘文件上使用
fflush的意义(该文件仍未被写入)。仅对我作为 user3386109 的我来说,清除不需要的键盘输入才有意义:例如,如果您问了一个重要问题并且您想确保没有预先输入缓冲。