C 为什么fflush(input_filestream)没有像manpage描述的那样在linux上丢弃缓冲区?

C 为什么fflush(input_filestream)没有像manpage描述的那样在linux上丢弃缓冲区?,c,linux,fflush,C,Linux,Fflush,Ubuntu上的manfflush: 对于与可查找文件(例如,磁盘文件,但不是管道或终端)关联的输入流,fflush()丢弃已从基础文件中提取但尚未被应用程序使用的任何缓冲数据 我读过一些关于fflush(stdin)和fflush()的问题,根据标准,输入流是未定义的行为,没错。但对于Linux来说,我读到一些评论说,这不是一个未定义的行为,而是一个扩展。是的,上面的手册页说明了它如何在文件输入流上工作 那么,为什么输入文件流不会丢弃从底层文件中提取的、但应用程序尚未使用的缓冲数据呢。正如手册

Ubuntu上的man
fflush

对于与可查找文件(例如,磁盘文件,但不是管道或终端)关联的输入流,
fflush()
丢弃已从基础文件中提取但尚未被应用程序使用的任何缓冲数据

我读过一些关于
fflush(stdin)
fflush()
的问题,根据标准,输入流是未定义的行为,没错。但对于Linux来说,我读到一些评论说,这不是一个未定义的行为,而是一个扩展。是的,上面的手册页说明了它如何在文件输入流上工作

那么,为什么输入文件流不会丢弃从底层文件中提取的、但应用程序尚未使用的缓冲数据呢。正如手册页所描述的那样

在网上搜索之前,我完全相信主页,现在我想知道它是否错了


示例代码:

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);
}
#包括
int
main()
{
文件*fp=fopen(“haha2.txt”、“r”);
intq=getc(fp);
fflush(fp);
int j=getc(fp);//我希望从这里开始,rest变量为-1(EOF)
int j2=getc(fp);//但它们仍然可以读取数据,就好像没有执行fflush一样
int j3=getc(fp);
intj4=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);
返回(0);
}

刷新文件缓冲区只会丢弃缓冲区中的数据。它不会影响文件的内容。后续读取将继续读取文件,就像什么都没有发生一样(除了首先必须再次填充缓冲区)

当然,这假定在此期间文件没有发生任何变化(例如,其他进程覆盖了文件的一部分,截断了文件,等等)

举例来说,如果修改代码以在
fflush
之后包含
sleep

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

int main() {
    FILE* fp = fopen("haha2.txt", "r");
    int q = getc(fp);
    fflush(fp);
    sleep(10);
    int j = getc(fp); // I expect the rest variables to be -1(EOF) starting from here
    printf("%d\n", j);
    return(0);
}
然后代码将打印
-1
(因为已到达文件末尾)


如果再次尝试相同的操作(请确保首先将测试数据添加回文件),但这次没有
fflush
,代码将打印文件中的第二个字符,因为文件的开头仍处于缓冲状态(即使实际文件不再包含任何内容).

刷新文件缓冲区只会丢弃缓冲区中的数据。它不会影响文件的内容。后续读取将继续读取文件,就像什么都没有发生一样(除了首先必须再次填充缓冲区)

当然,这假定在此期间文件没有发生任何变化(例如,其他进程覆盖了文件的一部分,截断了文件,等等)

举例来说,如果修改代码以在
fflush
之后包含
sleep

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

int main() {
    FILE* fp = fopen("haha2.txt", "r");
    int q = getc(fp);
    fflush(fp);
    sleep(10);
    int j = getc(fp); // I expect the rest variables to be -1(EOF) starting from here
    printf("%d\n", j);
    return(0);
}
然后代码将打印
-1
(因为已到达文件末尾)


如果再次尝试相同的操作(请确保首先将测试数据添加回文件),但这次没有
fflush
,代码将打印文件中的第二个字符,因为文件的开头仍处于缓冲状态(即使实际文件不再包含任何内容).

为什么您认为丢弃缓冲数据会阻止缓冲区再次被填充?这种
fflush
行为是Linux特有的。为什么不使用
ungetc
?@Rick:如果在刷新时,缓冲区保存着“123”(应用程序尚未读取),而输入流没有发生任何其他变化,那么后续读取应该会再次填充缓冲区,从“123…”开始。你能澄清一下你的确切要求吗?你是否在试图理解为什么行为不符合你的期望?或者您正在尝试让行为符合您的期望?我甚至不认为在磁盘文件(尚未写入)上使用
fflush
有什么意义。对于用户3386109来说,清除不需要的键盘输入对我来说才有意义:例如,如果你问了一个重要的问题,你想确保没有预输入缓冲。为什么你认为丢弃缓冲数据会阻止缓冲区再次被填满?这种
fflush
行为是Linux特有的。为什么不使用
ungetc
?@Rick:如果在刷新时,缓冲区保存着“123”(应用程序尚未读取),而输入流没有发生任何其他变化,那么后续读取应该会再次填充缓冲区,从“123…”开始。你能澄清一下你的确切要求吗?你是否在试图理解为什么行为不符合你的期望?或者您正在尝试让行为符合您的期望?我甚至不认为在磁盘文件(尚未写入)上使用
fflush
有什么意义。只有当我是用户3386109时,清除不需要的键盘输入才有意义:例如,如果你问了一个重要的问题,你想确保没有预先输入缓冲区。嘿,亲爱的Dycker,如果你有时间,你愿意帮我吗?这是UNIX®环境中高级编程的一个例子。嘿,亲爱的Dycker,如果你有时间,你愿意帮我吗?这是UNIX®环境中高级编程的一个示例。