繁体   English   中英

为什么我们需要绑定std :: cin和std :: cout?

[英]Why do we need to tie std::cin and std::cout?

默认情况下,标准输入设备与标准输出设备绑定在一起: 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()只是保证在cin执行输入之前刷新cout 这对于用户在被要求回答之前查看问题很有用。

但是,如果非tie()cincout ,也不能保证的缓冲cout被刷新。 但是不能保证缓冲区也不会被刷新。 实际上,如果计算机有足够的资源,它会立即刷新cout缓冲区,因此这会在cin请求输入之前发生。 在您的示例中就是这种情况。

所以,一切都运作良好。 除了在cin.tie(0) ,不能保证将发生冲洗。 但是,在99%的情况下,仍然会发生冲洗(但不再保证)。

从理论上讲,如果绑定, cincout可以共享相同的缓冲区。 但是,我认为没有实现这样做。 一个原因是两者可能是un-tie()d。

我认为,以前的答案是错误的(我想知道为什么它如此赞成并标记为真实,显然不是)。

要打破发生 - 之前的关系,你应该(仅在标准io的情况下)(1)删除与stdio同步 (2)解开流。

像这样:

std::cin.tie (nullptr);
std::cout.sync_with_stdio(false);
std::cout << "Please enter c: ";
std::cin >> c;

然后你保证有无条件的溪流。 与stdio同步是一种特殊的能力,以便在C-style和C ++风格的输入和输出之后进行适当的发生 - 我强烈反对你在没有真正必要的情况下删除它。

在C中,提示用户输入遵循您发出命令以打印提示消息的模式,然后是输入值的命令。

为了使此过程正常工作,您需要确保实际显示提示消息。 配置环境以使其自动:

  • 在DOS(或Windows命令行)环境中, STDOUT是无缓冲的,因此print命令会立即显示该消息。
  • 在* NIX环境中, STDOUT是行缓冲的。 因此,如果您在提示消息中遵循* NIX样式包含换行符,以便用户在下一行输入输入,则在输入之前会自动显示提示。

tie功能使这种自动刷新行为成为iostream库工作方式的一部分,而不是常规产品。 (虽然请注意,自动刷新仅在程序要求系统获取更多输入时发生,因此存在cin >> c实际上不会刷新的边缘情况)


然而! 默认情况下,iostream库与stdio库同步 在实践中,这意味着iostream根本不做任何缓冲; 它只是将数据转发到底层C库。

所以,这意味着如果您编写了类似的C程序,那么您将看到通常会看到的内容。 如果您在Windows命令行环境中,则不会缓冲输出,因此您在输入输入之前会看到提示。

要查看本机C ++行为,您需要通过运行std::cout.sync_with_stdio(false);来关闭同步std::cout.sync_with_stdio(false); 在程序开始时,如另一个答案所示

如果你这样做,那么cout语句将不会刷新输出缓冲区(除非缓冲区非​​常小)。 因为你已经删除了领带,所以cin语句也不会刷新它。 因此,在看到提示之前,您将获得必须输入用户输入的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM