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