缺省情况下,标准的输入设备与在形式在标准输出设备捆绑在一起: std::cin.tie (&std::cout);
这保证了被调用之前输入输出缓冲器被刷新。 所以,我试图通过使用解开它们std::cin.tie(0)
但似乎结果,与捆绑一个没有区别。
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
char c;
cin.tie(0)
cout << "Please enter c:";
cin >> c;
cout << c ;
return 0;
}
我在测试错了吗? 为什么我们需要绑在一起? 难道它们共享相同的缓冲?
没有什么错在你的例子(除了你应该在之后添加一个分号cin.tie(0)
线),也不能与方式iostream对象的工作。
tie()
简单地保证了冲洗cout
之前cin
执行输入。 为用户被要求回答之前看到的问题,这非常有用。
但是,如果非tie()
的cin
从cout
,也不能保证的缓冲cout
被刷新。 但是,不能保证缓冲区未刷新都不是。 事实上,如果计算机有足够的资源,这将刷新cout
立即缓冲区,所以在此之前发生cin
要求输入。 这是你的情况为例。
所以,一切正常。 除了后cin.tie(0)
也不能保证会发生冲洗-ING。 然而,在99%的情况,仍然会出现刷新-ING(但不能保证)。
从理论上讲,如果打成平手, cin
和cout
可以共享相同的缓冲区。 但是,我认为没有实现这样做的。 其中一个原因是,这两个可以是未配合()d。
我认为,以前的答案是错的(我不知道为什么会这样upvoted并标记为真,是显然不是)。
为了打破之前发生的领带,你应(只标准IO的情况下)(1)删除与标准输入输出和 (2)解开流同步。
像这样:
std::cin.tie (nullptr);
std::cout.sync_with_stdio(false);
std::cout << "Please enter c: ";
std::cin >> c;
那你都保证解开流。 与标准输入输出同步是为了有适当的发生,之后订购的C型和C ++特殊能力 - 风格的输入和输出,我强烈不从实际需要删除它阻止你。
在C中,提示用户进行输入,接着,您发出的命令来打印一个提示信息的模式,然后输入命令的值。
为了让这个过程中正常工作,你需要确保实际显示的提示信息。 环境进行配置,以便这是自动的:
- 在DOS(或窗口的命令行)的环境中,
STDOUT
是未缓冲的,所以打印命令显示消息立即。 - 在* NIX环境下,
STDOUT
的行缓冲。 所以,如果您是包括你的提示消息换行,以便用户在下一行进入输入* NIX的风格,你会提示输入自动之前显示。
领带的特征使得其iostream库的作品,而不是常规的产品的方式自动冲洗部分的这种行为。 (虽然知道,当程序请求系统,以获得更多的输入自动冲洗只发生,所以有边缘的情况下cin >> c
实际上并不会平齐)
然而! 默认情况下,iostream库与stdio库同步 。 在实践中,这意味着iostream的没有做任何缓冲可言; 它只是转移到底层C库中的数据转发。
因此,这意味着你所看到的你你通常会看到,如果你写了一个类似的C程序。 如果你在Windows命令行环境,输出不会被缓冲,所以你看在进入之前输入的提示。
要查看本地C ++的行为,您需要通过运行来关闭同步std::cout.sync_with_stdio(false);
在程序的开始,在显示对方的回答 。
如果你这样做,那么cout
语句不会刷新输出缓冲区(除非缓冲是非常小的)。 既然你已经删除了平局, cin
声明也不会刷新它。 所以,你会得到,你必须输入用户输入您看到提示之前的结果。