默认情况下,标准输入设备与标准输出设备绑定在一起,格式为: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;
}我的测试错了吗?为什么我们需要将它们捆绑在一起?它们是否共享相同的缓冲区?
发布于 2012-12-27 18:01:31
您的示例中没有任何错误(除了应该在cin.tie(0)行后面添加分号),iostream对象的工作方式也没有任何问题。
tie()只是保证在cin执行输入之前刷新cout。这对于用户在被询问答案之前查看问题很有用。
但是,如果您从cout取消tie()该cin,则不能保证刷新该cout的缓冲区。但是也不能保证缓冲区是未刷新的。事实上,如果计算机有足够的资源,它会立即刷新cout缓冲区,所以这发生在cin请求输入之前。这就是您的示例中的情况。
所以,一切都运行得很好。除了在cin.tie(0)之后,不能保证会发生刷新。然而,在99%的情况下,这种刷新仍然会发生(但不再有保证)。
理论上,如果并列,cin和cout可以共享相同的缓冲区。但是,我认为没有任何实现可以做到这一点。一个原因是这两个可能是un()d。
发布于 2017-02-25 03:01:43
我认为,之前的答案是错误的(我想知道为什么它如此受欢迎并被标记为正确,但显然不是)。
要打破发生-在平局之前,您应该(仅在标准io的情况下) (1)删除与stdio 和的同步(2)解开流。
如下所示:
std::cin.tie (nullptr);
std::cout.sync_with_stdio(false);
std::cout << "Please enter c: ";
std::cin >> c;然后,您将获得保证的,以获得解开的流。与stdio同步是一种特殊的能力,以便在对C样式和C++样式的输入和输出进行排序后有正确的发生,我强烈建议您在没有实际需要的情况下删除它。
发布于 2018-07-01 02:09:52
在C语言中,提示用户输入的方式是先发出打印提示消息的命令,然后再发出输入值的命令。
为了使此过程正常工作,您需要确保提示消息是实际显示的。将环境配置为自动执行此操作:
在DOS (或windows命令行)环境中,打印是无缓冲的,因此命令显示消息immediately.
STDOUT is STDOUT tie特性使这种自动刷新行为成为iostream库工作方式的一部分,而不是约定的产物。(尽管要知道,只有当程序要求系统获取更多输入时,才会发生自动刷新,因此在某些情况下,cin >> c实际上不会刷新)
然而!默认情况下,iostream库与stdio库同步。实际上,这意味着iostream根本不做任何缓冲;它只是将数据转发到底层C库。
这意味着你看到的是,如果你写了一个类似的C程序,你通常会看到的。如果你在windows命令行环境中,输出不会被缓冲,所以你会在输入之前看到提示。
要查看本机C++行为,需要在程序开始时运行std::cout.sync_with_stdio(false);来关闭同步,如the other answer中所示。
如果这样做,那么cout语句将不会刷新输出缓冲区(除非缓冲区非常小)。因为您已经删除了领带,所以cin语句也不会刷新它。因此,在看到提示之前,您必须输入用户输入才能得到结果。
https://stackoverflow.com/questions/14052627
复制相似问题