延迟输出直到EOF而不是换行

时间:2017-08-09 12:52:44

标签: c linux

我正在编写一个程序,在Linux终端上逐个字符地复制输入到输出。代码如下(来自Dennis Ritchie的C书)

#include <stdio.h>
/* copy input to output; 2nd version*/

main()
{
   int c;
   while ((c = getchar()) != EOF)
      putchar(c);
}

该程序及其执行工作正常。但我想稍作修改。

输出显示在每个新行字符的终端上(当我按下回车键时)。我想延迟输出,直到我通过按 Ctrl + D 发出信号结束信号。我必须对程序进行哪些修改才能在终端上延迟输出。

我得到的示例输出如下:

abcd (enter)
abcd
llefn;elnf(enter)
llefn;elnf
(ctrl+d)

我想得到的示例输出如下:

abcd(enter)
llefn;elnf(ctrl+d)
abcd
llefn;elnf

4 个答案:

答案 0 :(得分:2)

您需要将这些字符存储到缓冲区,控制索引在哪里编写,当您收到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;
}

答案 1 :(得分:2)

一个简单的,虽然草率和部分解决方案是将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()分配缓冲区。

答案 2 :(得分:1)

如上所述in the comments:将字符放入缓冲区并在结尾显示整个缓冲区:

 #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
 }

答案 3 :(得分:1)

您可以使用stdout将缓冲区设置为setvbuf(3)

#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在评论中正确指出的那样,缓冲区的大小有限可能会导致程序突然吐出其内容的垃圾邮件。为了避免这种情况,可以跟踪缓冲区的利用率并在填充时扩展其大小。