每个流都有一个状态,它是下面标志的组合:
注意,如果状态为0(std::ios_base::goodbit),那么该流处于无效状态。
下面列出了流的成员函数:
如果发生错误,那么上面的一个或者多个标志位就置位(赋值为“1”)。例如:
std::string strInvalid( "abc 123");
std::stringstream streamIn( strInvalid);
int n;
//试图读取一个数字,但是读到的却是字符“a”。
streamIn >> n;
// 这里,std::ios_base::failbit 置位
//不会发生什么事:strWillNotBeRead仍保持为空
std::string strWillNotBeRead;
streamIn >> strWillNotBeRead;
当你为你的自定义类型重载运算符>>和(或)<<时,你应该保持一种现有的惯例:如果你遇到一个错误,设置一个或者多个标志位。这是你的代码用户所期望的。
或许你想抛出一个例外,但是我们不推荐这么做,这是因为流例外是用另外一种方式来处理的(用成员函数exceptions())。只要任意一个状态标志位置位,那么使用stream.exceptions( state_flags)都将抛出一个错误。
std::string strInvalid( "abc 123");
std::stringstream streamIn( strInvalid);
streamIn.exceptions( std::ios_base::failbit | std::ios_base::badbit);
int n;
//试图读取一个数字,但是读到的却是字符“a”。
// std::ios_base::failbit置位,
// 这将导致抛出一个例外。
streamIn >> n;