c++ getline 似乎无法识别通过管道传输到标准输入的输入中的换行符
c++ getline does not seem to recognize newlines in input piped to stdin
此代码:
$猫junk.cpp
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include <string>
using namespace std;
int
main(int argc, char **argv)
{
string line;
while(getline(cin, line))
{
cout << line << endl;
}
return 0;
}
如果我 运行 它工作正常,然后输入 "hi" 和“那里
$ 垃圾
你好
你好
那里
那里
到目前为止一切顺利。
但我还有另一个程序:
$猫junk1.c
#include <stdio.h>
int
main(int argc, char **argv)
{
int i = 4;
while(i--)
{
printf("abc\n");
sleep(1);
}
return 0;
}
这个输出4行"abc\n",每行后休眠
所以如果我这样做:
垃圾1 |垃圾
我希望看到 "abc" 的每一行之后都是 1 秒的睡眠,但我看到的是 4 秒的睡眠,最后是所有 4 "abc" 行。
显然 getline() 正在缓冲来自 junk1 的所有输出,并且仅在 junk1 终止时才继续。
这不是我需要的行为,因为我想将标准输出从一个 运行 永远存在并产生大量输出的程序传输到 junk.cpp.[=12= 这样的程序]
知道这里发生了什么吗?
谢谢!
这可能是由于 junk1.c
中的 stdout
被缓冲造成的:所有对其的写入(通过 printf
或任何其他方式)都收集在内存缓冲区中,并且仅在程序退出时写入 stdout
。
要强制 stdout
实际写入缓冲区中的内容,您必须使用 flush
(在您的情况下,您应该在每个 printf
之后使用它)。
此代码:
$猫junk.cpp
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include <string>
using namespace std;
int
main(int argc, char **argv)
{
string line;
while(getline(cin, line))
{
cout << line << endl;
}
return 0;
}
如果我 运行 它工作正常,然后输入 "hi" 和“那里
$ 垃圾 你好 你好 那里 那里
到目前为止一切顺利。
但我还有另一个程序:
$猫junk1.c
#include <stdio.h>
int
main(int argc, char **argv)
{
int i = 4;
while(i--)
{
printf("abc\n");
sleep(1);
}
return 0;
}
这个输出4行"abc\n",每行后休眠
所以如果我这样做:
垃圾1 |垃圾
我希望看到 "abc" 的每一行之后都是 1 秒的睡眠,但我看到的是 4 秒的睡眠,最后是所有 4 "abc" 行。
显然 getline() 正在缓冲来自 junk1 的所有输出,并且仅在 junk1 终止时才继续。
这不是我需要的行为,因为我想将标准输出从一个 运行 永远存在并产生大量输出的程序传输到 junk.cpp.[=12= 这样的程序]
知道这里发生了什么吗?
谢谢!
这可能是由于 junk1.c
中的 stdout
被缓冲造成的:所有对其的写入(通过 printf
或任何其他方式)都收集在内存缓冲区中,并且仅在程序退出时写入 stdout
。
要强制 stdout
实际写入缓冲区中的内容,您必须使用 flush
(在您的情况下,您应该在每个 printf
之后使用它)。