当遇到无效数据时重置流的状态

ZDNet软件频道 时间:2003-06-05 作者:ZDNet China |  我要评论()
本文关键词:cpptips
STL流提供了许多种从不同的源读取数据以及把数据写到不同目的地的方法。STL也提供了若干预定义类,如fstream和stringstream。
本文译自Builder.com,未经许可请勿转载STL流提供了许多种从不同的源读取数据以及把数据写到不同目的地的方法。STL也提供了若干预定义类,如fstream(文件流)和stringstream(带有底层字符串的流)。

每个流都有一个状态,它是下面标志的组合:

  • std::ios_base::badbit:这个流处于一个无效状态。
  • std::ios_base::failbit:对这个流进行下一次操作将会失败。
  • std::ios_base::eofbit:流指针指向它的结尾(End)。

注意,如果状态为0(std::ios_base::goodbit),那么该流处于无效状态。

下面列出了流的成员函数:

  • rdstate():用来读取状态。
  • setstate(nFlags):用来设置一个或者多个标志。
  • clear():用来重置状态。

如果发生错误,那么上面的一个或者多个标志位就置位(赋值为“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;


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134