什么可能导致流进入“坏”状态?

时间:2012-08-28 14:38:41

标签: c++ stream iostream

在C ++中,每个流都有一个bad位:

  

此标志由在读取或写入数据时发生错误时对流执行的操作设置,通常会导致流的完整性丢失。

Source

什么会导致流“失去完整性”并进入bad状态?这与fail状态不同,当输入流尝试将值存储到不能接受所述值的变量(例如尝试将字符串存储到整数变量中)时,最常出现这种情况。 / p>

请注意,此问题是c++ file bad bit的更一般形式,特定于文件输入流;这个问题并不完全重复,因为它通常适用于输入和输出流。

2 个答案:

答案 0 :(得分:13)

根据cppreference.com

  

标准库在以下情况下设置badbit:

     
      
  • put()write()对输出流的插入失败   原因。

  •   
  • operator<<std::put_money或{插入>输出流   std::put_time,无法完成,因为输出结束   达到了流(facet的格式化输出函数,如   num_put::put()money_put::put(),返回迭代器iter等   那iter.failed()==true

  •   
  • 使用rdbuf()的空指针构建Stream,或   putback() / unget()在具有空rdbuf()或a的流上调用   传递给operator<<(basic_streambuf*)

  • 的空指针   
  • rdbuf()->sputbackc()rdbuf()->sungetc()返回traits::eof()   putback() or unget()'

  •   
  • rdbuf()->pubsync()将-1返回sync()flush(),或返回   ostream::sentry

  • unitbuf的析构函数   
  • 任何成员函数在I / O操作期间抛出异常   关联的流缓冲区(例如sbumpc()xsputn()sgetc(),   overflow()等)

  •   
  • iword()pword()(例如std::bad_alloc

  • 引发异常   

这可能是通过www.cpluplus.com选择cppreference.com的另一个原因,请参阅: What's wrong with cplusplus.com?

答案 1 :(得分:1)

看看Apache C++ Standard Library User's Guide。这里列出了两个可能的badbit原因。我引用:

内存不足:没有可用于创建缓冲区的内存,或者由于其他原因(例如从流外部提供)缓冲区大小为0,或者流无法分配内存它自己的内部数据。

基础流缓冲区引发异常:流缓冲区可能会失去其完整性,如内存不足或代码转换失败,或外部设备无法恢复的读取错误。流缓冲区可以通过抛出异常来指示这种完整性的丢失,该异常被流捕获并导致在流的状态中设置badbit。