当前位置: 首页 > 知识库问答 >
问题:

未缓冲流的行为类似于行缓冲

澹台岳
2023-03-14

我正在阅读有关流的信息,发现我们可以使用setvbuf()函数来控制流......它写的是在行缓冲模式中,当遇到换行符时流将数据发送到文件中,在无缓冲状态下没有缓冲......所以我写了以下代码......

#include<stdio.h>


int main()
{

setvbuf(stdin, NULL, _IONBF, 40);
setvbuf(stdout, NULL, _IONBF, 40);
while(1)
{
char a[40];
int n;
n=fread(a, 1, 4, stdin);

if(n>0)
fwrite(a, 1, n, stdout);
}
return 0;
}

所以我认为,因为这些是无缓冲流,所以输入应该在我写入屏幕后立即发送到标准输出。。。但程序在写入每一行后等待我按enter键,然后屏幕上只显示输出(由于fwrite)。。。我的问题是,当这些是无缓冲流时,为什么progam要等待enter(即newline)。。。

共有1个答案

龙承德
2023-03-14

我相信这是由于您环境中的shell是如何工作的:您输入的数据stdin上不可用,直到您点击Enter,因此fread会阻塞,直到它可以从流中读取某些内容

想想如果shell将每个字符都传递给缓冲区,那么需要如何处理后台空间等

 类似资料:
  • 问题内容: 我正在使用FileWriter,并且注意到了奇怪的行为。我自己和我使用的每x行缓冲我的收藏 它不会写入文件。我继续用更多的行来称呼它,直到它写满后才写入文件。 它是否使用缓冲区?我在其文档中找不到它。 问题答案: 第二句的类概述说: 此类的构造函数假定默认字符编码 和默认字节缓冲区大小 是可接受的。要自己指定这些值,请在FileOutputStream上构造一个OutputStream

  • 问题内容: 是缓冲还是无缓冲? 我读到这是的对象,并且是所引用的对象的类型。 而且它们都是Unbuffered的,所以为什么要刷新unbuffered …是否可以刷新unbuffered,我已经读过它们被立即写入。 问题答案: 是“标准”输出。在大多数操作系统上,终端io被缓冲,并且支持分页。 在Javadoc中, “标准”输出流。该流已经打开并且准备接受输出数据。通常,此流对应于主机环境或用户指

  • 正在为以下内容编写javadoc: 但是,将缓冲的输入流传入真的是一个问题吗?因此: 是否将is缓冲到bis中,或者java是否检测到is已缓冲并设置bis=is?如果是,不同的缓冲区大小是否会有所不同?如果没有,为什么不呢<注意:我说的是输入流,但实际上这个问题也适用于输出流

  • 我有很多PDF文件,我需要得到它的内容编码使用Base64。我有一个Akka应用程序,它以流的形式获取文件,并分发给许多工人来编码这些文件,并为每个文件返回字符串base64。我得到了一个编码的基本解决方案: 它工作,但我想知道什么将是最好的方式,我可以使用缓冲区编码文件,如果有一个更快的替代这一点。 我测试了一些其他方法,例如: null 任何投入都是很有帮助的。谢谢你!

  • 问题内容: 我碰到一行,命令的输出已完全缓冲。这是什么意思? 问题答案: 在线C11标准 7.21.3 / 3: 当流没有 缓冲时 ,字符应尽快从源或目标出现。否则,字符可能会作为块被累积并传输到主机环境或从主机环境传输。当流被 完全缓冲时 ,打算在填充缓冲区时将字符作为块与主机环境进行传输。当流被 行缓冲时 ,当遇到换行符时,字符打算作为块与主机环境进行传输。此外,当填充缓冲区,在无缓冲流上请求

  • 出于性能的考虑,servlet 容器允许(但不要求)缓存输出到客户端的内容。一般的,服务器是默认执行缓存,但应该允许 servlet 来指定缓存参数。 下面是 ServletResponse 接口允许 servlet 来访问和设置缓存信息的方法: getBufferSize setBufferSize isCommitted reset resetBuffer flushBuffer 不管 ser