在我解开两个溪流后,cin导致cout冲洗

时间:2013-02-20 23:11:08

标签: c++ iostream

我试图理解关于tie()的iostream的行为。根据我的发现,下面的代码不应该向屏幕输出任何内容。

    cin.tie(NULL);
    int i;
    cout << "TEST";
    cin >> i;
    while (true);

相反,它应该表现得像

    cin.tie(NULL);
    int i;
    cout << "TEST";
    read(0, &i, sizeof(int));
    while (true);

换句话说,当调用cin输入时,即使流被解开,cout缓冲区也会被刷新。我尝试用g ++ 4.8.0和4.6.3编译这段代码。 我也尝试在cin.tie()之后调用cin.tie(NULL)并正确返回NULL,因此不应绑定流。

还有更多我想要的tie()吗?

1 个答案:

答案 0 :(得分:3)

您没有执行cout.sync_with_stdio(false);,因此您的std::cout 已与CI / O同步,这意味着每个输出都是单独的,并立即发送到CI / O库调用,然后在您的情况下受制于实现定义的glibc规则。

快速检查,this glibc manual提及

  

...流上的缓冲输出会自动刷新:

     
      
  • 每当任何流上的输入操作实际上从其文件中读取数据时。
  •   

(虽然它听起来并不令人信服,因为还没有从stdin中读取任何东西..在任何情况下,cout.sync_with_stdio(false)都会使cin.tie(NULL)测试用例在我的Linux上按预期运行。)