默认情况下,标准输入设备与标准输出设备绑定在一起:
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;
}
我测试错了吗?为什么我们需要把它们绑在一起?他们共享相同的缓冲区吗?
答案 0 :(得分:16)
您的示例中没有任何错误(除了您应该在cin.tie(0)
行之后添加分号),以及iostream对象的工作方式。
tie()
只是保证在cout
执行输入之前刷新cin
。这对于用户在被要求回答之前查看问题非常有用。
但是,如果您从tie()
取消cin
cout
,则无法保证cout
的缓冲区已被刷新。但是不能保证缓冲区也不会被刷新。实际上,如果计算机有足够的资源,它将立即刷新cout
缓冲区 ,因此这会在cin
请求输入之前发生。在您的示例中就是这种情况。
所以,一切都运作良好。除cin.tie(0)
之后,无法保证会发生冲洗。但是,在99%的情况下,仍然会发生冲洗(但不再保证)。
理论上,如果绑定,cin
和cout
可以共享相同的缓冲区。但是,我认为没有实现这样做。一个原因是两者可能是un-tie()d。
答案 1 :(得分:3)
我认为,之前的回答是错误的(我想知道为什么它如此赞成并标记为真实,显然不是)。
要打破发生之前 - 你应该(仅限标准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 ++风格的输入和输出之后进行适当的发生 - 我强烈反对你在没有真正必要的情况下删除它。
答案 2 :(得分:0)
在C语言中,提示用户进行输入是遵循以下模式的:在该模式下,您发出了一个命令来打印提示消息,然后发出了一个命令来输入值。
为了使此过程正常进行,您需要确保确实显示了提示消息。配置了环境,使其是自动的:
STDOUT
是未缓冲的,因此print命令会立即显示该消息。STDOUT
是行缓冲的。因此,如果您遵循* NIX样式,在提示消息中包括换行符,以便用户在下一行输入输入,则提示将在输入之前自动显示。 tie功能使自动刷新的这种行为成为iostream库工作方式的一部分,而不是约定的产物。 (尽管请注意,仅当程序要求系统获取更多输入时才会发生自动刷新,因此在某些情况下cin >> c
不会真正刷新)
但是!默认情况下,iostream库与stdio库同步。实际上,这意味着iostream根本不执行任何缓冲。只需将数据转发到基础C库。
所以,这意味着您看到的是如果编写类似的C程序通常会看到的内容。如果您在Windows命令行环境中,则不会缓冲输出,因此在输入输入之前会看到提示。
要查看本机C ++的行为,您需要通过在程序开始时运行std::cout.sync_with_stdio(false);
来关闭同步,如the other answer所示。
如果您这样做,那么cout
语句将不会刷新输出缓冲区(除非缓冲区很小)。而且,由于您已删除领带,因此cin
语句也不会刷新领带。因此,您将获得结果,在看到提示之前必须输入用户输入。