首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们需要绑定std::cin和std::cout?

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

Stack Overflow用户
提问于 2012-12-27 17:50:56
回答 3查看 11.4K关注 0票数 22

默认情况下,标准输入设备与标准输出设备绑定在一起,格式为:std::cin.tie (&std::cout);,它保证在调用输入之前已经刷新了输出缓冲区。所以我试着用std::cin.tie(0)来解开它们,但似乎结果,与绑定的结果没有区别。

代码语言:javascript
复制
#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;
}

我的测试错了吗?为什么我们需要将它们捆绑在一起?它们是否共享相同的缓冲区?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-27 18:01:31

您的示例中没有任何错误(除了应该在cin.tie(0)行后面添加分号),iostream对象的工作方式也没有任何问题。

tie()只是保证在cin执行输入之前刷新cout。这对于用户在被询问答案之前查看问题很有用。

但是,如果您从cout取消tie()cin,则不能保证刷新该cout的缓冲区。但是也不能保证缓冲区是未刷新的。事实上,如果计算机有足够的资源,它会立即刷新cout缓冲区,所以这发生在cin请求输入之前。这就是您的示例中的情况。

所以,一切都运行得很好。除了在cin.tie(0)之后,不能保证会发生刷新。然而,在99%的情况下,这种刷新仍然会发生(但不再有保证)。

理论上,如果并列,cincout可以共享相同的缓冲区。但是,我认为没有任何实现可以做到这一点。一个原因是这两个可能是un()d。

票数 27
EN

Stack Overflow用户

发布于 2017-02-25 03:01:43

我认为,之前的答案是错误的(我想知道为什么它如此受欢迎并被标记为正确,但显然不是)。

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

如下所示:

代码语言:javascript
复制
std::cin.tie (nullptr);
std::cout.sync_with_stdio(false);
std::cout << "Please enter c: ";
std::cin >> c;

然后,您将获得保证的,以获得解开的流。与stdio同步是一种特殊的能力,以便在对C样式和C++样式的输入和输出进行排序后有正确的发生,我强烈建议您在没有实际需要的情况下删除它。

票数 6
EN

Stack Overflow用户

发布于 2018-07-01 02:09:52

在C语言中,提示用户输入的方式是先发出打印提示消息的命令,然后再发出输入值的命令。

为了使此过程正常工作,您需要确保提示消息是实际显示的。将环境配置为自动执行此操作:

在DOS (或windows命令行)环境中,打印是无缓冲的,因此命令显示消息immediately.

  • In a*
    • STDOUT is STDOUT
    • 。因此,如果您遵循*NIX样式在提示消息中包含换行符,以便用户在下一行输入输入,则提示会在输入之前自动显示。

tie特性使这种自动刷新行为成为iostream库工作方式的一部分,而不是约定的产物。(尽管要知道,只有当程序要求系统获取更多输入时,才会发生自动刷新,因此在某些情况下,cin >> c实际上不会刷新)

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

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

要查看本机C++行为,需要在程序开始时运行std::cout.sync_with_stdio(false);来关闭同步,如the other answer中所示。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14052627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档