[英]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.