交错cout和cin操作是否需要显式刷新?

时间:2013-11-29 21:38:21

标签: c++ stream iostream flush

我注意到在许多源代码文件中,可以看到在cout 读取之前写入cin而没有显式刷新:

#include <iostream>
using std::cin; using std::cout;

int main() {
    int a, b;
    cout << "Please enter a number: ";
    cin >> a;
    cout << "Another nomber: ";
    cin >> b;
}

执行此操作并且用户输入42[Enter]73[Enter]时,它可以很好地打印(g ++ 4.6,Ubuntu):

Please enter a number: 42
Another number: 73

这是定义的行为吗,即标准是否说在读取cout之前以某种方式 cin被刷新?我可以在所有符合要求的系统上预期这种行为吗?

或者应该在这些消息后添加显式cout << flush

1 个答案:

答案 0 :(得分:9)

默认情况下,流std::coutstd::cin绑定:stream.tie()指向的流在每次正确实现输入操作之前刷新。除非您更改了绑定到std::cin的流,否则在使用std::cout之前无需刷新std::cin,因为它将隐式执行。

在使用输入流构造std::istream::sentry时,会刷新流的实际逻辑:当输入流未处于故障状态时,stream.tie()指向的流将被刷新。当然,这假设输入运算符看起来像这样:

std::istream& operator>> (std::istream& in, T& value) {
    std::istream::sentry cerberos(in);
    if (sentry) {
        // read the value
    }
    return in;
}

标准流操作以这种方式实现。当用户的输入操作未以此样式实现并使用流缓冲区直接进行输入时,不会发生刷新。当然,错误在输入操作符中。