读入 while 循环

Read in while loop

我一直在努力思考缓冲区和依赖于它们的 I/O 函数,当我遇到这段代码时,起初看起来很直观,但是一旦我开始玩它,得到的结果是我意想不到的。

我使用 while 循环 read() 标准输入的每一行,并 printf() 打印出我阅读的内容。几次输入后,打印输出开始变得奇怪,这似乎不正常,因为知道 read() 每次调用时都会覆盖目标缓冲区。

char line[256];
int n;

while((n = read(STDIN_FILENO, line, 256) > 0)
    printf("%s", line);

在第三次拍摄 (abcdefghj) 时,printf 似乎开始混合结果。

abc
abc
abcdef
abcdef
abcdefghj
cdeabcdefghj

read 不会在字符串末尾添加 '[=13=]' 终止符 - 您需要自己执行此操作,例如

while((count = read(STDIN_FILENO, line, 255) > 0)
{                                    // ^^^ NB: need to allow room for terminator !
    line[count] = '[=10=]';
    printf("%s", line);
}

或者您可以告诉 printf 要打印多少个字符而不用担心终止符:

while((count = read(STDIN_FILENO, line, 256) > 0)
{                                    
    printf("%.*s\n", count, s);
}

read 用于读取 "raw bytes" 而不是字符串,因此它不会以字符串终止字符 [=12=] 终止输入。如果你将结果打印到控制台,如果你运气好(或坏?),缓冲区已经用 0 初始化,这样你实际上会收到一个字符串输出。

但如果第二行比读入的第一行短,您将只覆盖第一行内容的一部分,并将剩余部分与第二行一起打印出来。

写...

while (fgets(line, 256,STDIN_FILENO)) {
   fputs(line,stdout);
   ...
}

一切都应该正常。