簡體   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