我试图理解关于tie()的iostream的行为。根据我的发现,下面的代码不应该向屏幕输出任何内容。
cin.tie(NULL);
int i;
cout << "TEST";
cin >> i;
while (true);
相反,它应该表现得像
cin.tie(NULL);
int i;
cout << "TEST";
read(0, &i, sizeof(int));
while (true);
换句话说,当调用cin输入时,即使流被解开,cout缓冲区也会被刷新。我尝试用g ++ 4.8.0和4.6.3编译这段代码。
我也尝试在cin.tie()
之后调用cin.tie(NULL)
并正确返回NULL,因此不应绑定流。
还有更多我想要的tie()吗?
答案 0 :(得分:3)
您没有执行cout.sync_with_stdio(false);
,因此您的std::cout
已与CI / O同步,这意味着每个输出都是单独的,并立即发送到CI / O库调用,然后在您的情况下受制于实现定义的glibc规则。
快速检查,this glibc manual提及
...流上的缓冲输出会自动刷新:
- 每当任何流上的输入操作实际上从其文件中读取数据时。
(虽然它听起来并不令人信服,因为还没有从stdin中读取任何东西..在任何情况下,cout.sync_with_stdio(false)
都会使cin.tie(NULL)
测试用例在我的Linux上按预期运行。)