我们为什么要配合给std :: cin和std ::法院?(Why do we need to ti

2019-07-17 14:35发布

缺省情况下,标准的输入设备与在形式在标准输出设备捆绑在一起: 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;
}

我在测试错了吗? 为什么我们需要绑在一起? 难道它们共享相同的缓冲?

Answer 1:

没有什么错在你的例子(除了你应该在之后添加一个分号cin.tie(0)线),也不能与方式iostream对象的工作。

tie()简单地保证了冲洗cout之前cin执行输入。 为用户被要求回答之前看到的问题,这非常有用。

但是,如果非tie()cincout ,也不能保证的缓冲cout被刷新。 但是,不能保证缓冲区未刷新都不是。 事实上,如果计算机有足够的资源,这将刷新cout 立即缓冲区,所以在此之前发生cin要求输入。 这是你的情况为例。

所以,一切正常。 除了后cin.tie(0)也不能保证会发生冲洗-ING。 然而,在99%的情况,仍然会出现刷新-ING(但不能保证)。

从理论上讲,如果打成平手, cincout可以共享相同的缓冲区。 但是,我认为没有实现这样做的。 其中一个原因是,这两个可以是未配合()d。



Answer 2:

我认为,以前的答案是错的(我不知道为什么会这样upvoted并标记为真,是显然不是)。

为了打破之前发生的领带,你应(只标准IO的情况下)(1)删除与标准输入输出 (2)解开流同步。

像这样:

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

那你都保证解开流。 与标准输入输出同步是为了有适当的发生,之后订购的C型和C ++特殊能力 - 风格的输入和输出,我强烈不从实际需要删除它阻止你。



Answer 3:

在C中,提示用户进行输入,接着,您发出的命令来打印一个提示信息的模式,然后输入命令的值。

为了让这个过程中正常工作,你需要确保实际显示的提示信息。 环境进行配置,以便这是自动的:

  • 在DOS(或窗口的命令行)的环境中, STDOUT是未缓冲的,所以打印命令显示消息立即。
  • 在* NIX环境下, STDOUT的行缓冲。 所以,如果您是包括你的提示消息换行,以便用户在下一行进入输入* NIX的风格,你会提示输入自动之前显示。

领带的特征使得其iostream库的作品,而不是常规的产品的方式自动冲洗部分的这种行为。 (虽然知道,当程序请求系统,以获得更多的输入自动冲洗只发生,所以有边缘的情况下cin >> c实际上并不会平齐)


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

因此,这意味着你所看到的你你通常会看到,如果你写了一个类似的C程序。 如果你在Windows命令行环境,输出不会被缓冲,所以你看在进入之前输入的提示。

要查看本地C ++的行为,您需要通过运行来关闭同步std::cout.sync_with_stdio(false); 在程序的开始,在显示对方的回答 。

如果你这样做,那么cout语句不会刷新输出缓冲区(除非缓冲是非常小的)。 既然你已经删除了平局, cin声明也不会刷新它。 所以,你会得到,你必须输入用户输入您看到提示之前的结果。



文章来源: Why do we need to tie std::cin and std::cout?