读入while循环

时间:2019-01-15 11:01:25

标签: c io buffer

当我遇到这段代码片段时,我一直试图将缓冲区和依赖于它们的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

2 个答案:

答案 0 :(得分:1)

read用于读取“原始字节”而不是字符串,因此它不会以字符串终止字符\0终止输入。如果将结果打印到控制台,如果运气好(或不好?),则缓冲区已使用0进行了初始化,因此您实际上可以接收到字符串输出。

但是,如果第二行比读入的第一行短,那么您将覆盖第一行内容的一部分,并将其余内容与第二行一起再次打印出来。

写...

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

一切正常。

答案 1 :(得分:0)

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

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

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

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