[英]Delay output till EOF rather than newline
我正在编写一个程序,将输入复制到Linux终端上的每个字符。 代码如下(摘自Dennis Ritchie的C书)
#include <stdio.h>
/* copy input to output; 2nd version*/
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
该程序及其执行正常。 但我想稍作修改。
输出显示在终端上每个换行符(当我按Enter时)。 我想延迟输出,直到我按Ctrl + D表示文件结束。 为了延迟我在终端上的输出,我必须对该程序进行哪些修改。
我得到的样本输出如下:
abcd (enter)
abcd
llefn;elnf(enter)
llefn;elnf
(ctrl+d)
我想要获得的样本输出如下:
abcd(enter)
llefn;elnf(ctrl+d)
abcd
llefn;elnf
您需要将这些字符存储在缓冲区中, 控制索引的位置以及要在收到EOF
时通过printf
打印该缓冲区。
如果您解决不了,可以在这里激发灵感
#include <stdio.h>
#define BUFFER_SIZE 1024
int main()
{
int c, i = 0;
char buffer[BUFFER_SIZE];
while ((c = getchar()) != EOF)
{
if (i < BUFFER_SIZE - 1)
{
buffer[i] = c;
i++;
}
else
{
buffer[BUFFER_SIZE - 1] = '\0';
printf("%s", buffer);
i = 0;
}
}
buffer[i] = '\0';
printf("%s", buffer);
return 0;
}
一个简单但草率的解决方案是将stdout
配置为使用大缓冲区完全缓冲:
#include <stdio.h>
int main(void) {
int c;
setvbuf(stdout, NULL, _IOFBF, 32767);
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
笔记:
NULL
传递给setvbuf
使其可以使用malloc()
分配缓冲区。 您可以使用setvbuf(3)
将缓冲区设置为stdout
。
#include <stdio.h>
main()
{
int c;
char buf[BUFSIZ];
setvbuf(stdout,buf,_IOFBF,BUFSIZ);
while ((c=getchar())!=EOF)
putchar(c);
}
此处的关键是使用_IOFBF
常量指定的完全缓冲模式。 缓冲区的大小设置为BUFSIZ
,通常等于8192。
正如乔纳森·莱夫勒(Jonathan Leffler)在评论中正确指出的那样,缓冲区的有限大小可能会导致程序突然吐出其内容,从而使终端变乱。 为了避免这种情况,可以跟踪缓冲区的利用率并在缓冲区被填充时扩展其大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.