我注意到在许多源代码文件中,可以看到在没有显式刷新的情况下从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;
}
标准流操作以这种方式实现.当用户的输入操作未以此样式实现并使用流缓冲区直接进行输入时,不会发生刷新.当然,错误在输入操作符中.