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

bwD*_*aco 10 c++ iostream stream

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

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

资源

什么会导致流"失去诚信"并进入bad状态?这与fail状态不同,当输入流尝试将值存储到不能接受所述值的变量(例如尝试将字符串存储到整数变量中)时,通常会发生这种情况.

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

小智 14

根据cppreference.com:

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

  • 由于任何原因插入输出流put()write()失败.

  • 插入到由输出流operator<<,std::put_moneystd::put_time,不能完成,因为输出流的末尾达到(小面的格式化输出功能,例如 num_put::put()money_put::put(),返回迭代iter使得iter.failed()==true)

  • 流由用于一个空指针rdbuf(),或 putback()/ unget()上调用流与空rdbuf(),或传递给一个空指针operator<<(basic_streambuf*)

  • rdbuf()->sputbackc()或者rdbuf()->sungetc()返回traits::eof()putback() orunget()`

  • rdbuf()->pubsync()返回-1到sync(),到flush(),或到的析构函数ostream::sentry上的unitbuf

  • 异常是由相关联的数据流缓存器中的任何成员功能的I/O操作期间抛出(例如sbumpc(),xsputn(),sgetc(), overflow(),等等)

  • 抛出异常iword()pword()(例如std::bad_alloc)


这可能是通过www.cpluplus.com选择cppreference.com的另一个原因,请参阅:cplusplus.com有 什么问题?

  • "基础I/O操作中的异常"听起来像是一个很好的领导.毕竟,iostream旨在扩展,因此完全可以想象一些用户提供的实现会使异常更深入. (3认同)