为什么我们刷新流而不是缓冲区?

wal*_*ala 5 c c++ buffer fflush

我知道这将是一个非常愚蠢的问题,但在阅读了很多关于整个"缓冲"系统的文档之后,我无法理解为什么人们会刷新流而不是缓冲区.

我见过人们写这样的东西:

FILE* file=fopen("mytext.txt","wr");
char buffer[10]="";
setbuf(file,buffer);

//do some stuff....

fflush(file);
....
fclose(file);
Run Code Online (Sandbox Code Playgroud)

所以我想知道,因为我们实际上将事物存储在缓冲区中,为什么我们要刷新与之关联的流而不是直接刷新缓冲区,这实际上存储了一些东西并且应该被刷新.(好吧,有些人告诉我,如果事情发生了就像我说的那样只会是同样的事情所以打扰自己......)

例如,我们不能写像.fflush(buffer)为什么?

mil*_*bug 6

刷新将数据从流的内部缓冲区复制到基础文件.

因此,刷新功能需要知道要复制的源和目标.

这取决于I/O实现,对于C++,<iostream>请参阅Jerry Coffin的答案 - 缓冲区<iostream>更加智能.

使用C风格<cstdio>,如果你想只刷一个参数,或者FILE*char数组需要知道它应该复制到的文件.

你的缓冲区是一个哑数组,它只存储读/写数据.由于那里没有附加信息,获取指向缓​​冲区的指针的函数无法知道目标在哪里写入 - 所以虚构的fflush调用看起来就像是fflush(buffer, file);哪个不会让你到处都是.另一方面,FILE*存储指向缓冲区的指针(使用setbuf(file,buffer)函数调用设置指针).