我注意到在许多源代码文件中,可以看到在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
?
答案 0 :(得分:9)
默认情况下,流std::cout
与std::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;
}
标准流操作以这种方式实现。当用户的输入操作未以此样式实现并使用流缓冲区直接进行输入时,不会发生刷新。当然,错误在输入操作符中。