我真的很混淆缓冲区的工作原理。所以我写了一小段代码来验证:
fs
如您所见,我将文件流fully buffered
设置为1024
流(我知道大多数时候它会默认为完全缓冲。只是确保)。我还将其相关缓冲区设置为大小fread()
,这意味着直到它包含1024字节的内容才会刷新流(对吗?)。
在我看来,buf
的例程是,它从文件流中读取数据,将其存储在缓冲区buf
,然后arr
中的数据将是一旦满了1024字节的数据就发送到test.txt
(对吗?)。
但现在,我只从流中读取一个字符!!而且,文件arr
中只有四个字符。为什么我可以在{{1}}中找到一些内容,以防只有一个字符(我可以打印出一个字符)
答案 0 :(得分:2)
完全缓冲,行缓冲和无缓冲之间的区别实际上仅对输出流有影响。我很确定输入流几乎总是像它们被完全缓冲一样。
但是即使对于完全缓冲的输入流,至少有一种情况是缓冲区不会完全填满,正如您所发现的那样,输入中没有足够的字符来填充缓冲区。如果文件中只有4个字符,那么当系统填充缓冲区时,它会获得这4个字符并将它们放入缓冲区,然后你可以照常开始取出它们。
(只要文件包含的字符数不是缓冲区大小的精确倍数,就会出现同样的情况。例如,如果输入文件包含1028个字符,那么在用前1024个字符填充缓冲区之后让你读它们,下次它填充缓冲区时,它最终再次为4。)
在这种情况下你有什么期望呢?阻止等待从文件中读取1,020多个字符(这些字符永远不会出现)?
P.S。你说“直到它包含1024字节的内容才会刷新流,对吧?”但是,仅为输出流定义了刷新;它对输入流没有任何意义。
答案 1 :(得分:1)
据我所知,输入缓冲区的工作方式与您的建议不同:如果您要求读取一个字节,系统会将1023个字节读入缓冲区,因此在接下来的1023个后续读取调用中,它可以直接返回数据从缓冲区而不是必须从文件中读取。