读入 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);
...
}
一切都应该正常。
我一直在努力思考缓冲区和依赖于它们的 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);
...
}
一切都应该正常。