繁体   English   中英

将输出延迟到EOF而不是换行符

[英]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;
}

笔记:

  • 在32位或64位系统上,您可以使缓冲区大得离谱。
  • NULL传递给setvbuf使其可以使用malloc()分配缓冲区。

正如评论中已经提到 :将字符放入缓冲区并在最后显示整个缓冲区:

 #include <stdio.h>

 #define BUF_SIZE 1024

 int main()
 {
      char str[BUF_SIZE]; // the buffer
      int c, i = 0;

      while (i < BUF_SIZE-1 && (c = getchar()) != EOF)
         str[i++] = (char) c;

      str[i] = '\0';

      printf("%s\n", str); // display the contents of the buffer
 }

您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM