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

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

#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

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

或者应该放一个明确的cout<<那些消息后冲洗?

解决方法:

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

当使用输入流构造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;
}

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

上一篇:linux – 如何丢弃原始套接字中的传入数据包?


下一篇:java.lang.IllegalStateException异常以及解决