1

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

    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() 吗?

4

1 回答 1

3

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

快速检查一下,这个 glibc 手册提到

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

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

(虽然这听起来并不令人信服,因为还没有从标准输入中读取任何内容。无论如何,cout.sync_with_stdio(false)这使得这个cin.tie(NULL)测试用例在我的 Linux 上表现得如预期)。

于 2013-02-20T23:34:17.957 回答