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

What could cause a stream to enter the "bad" state?

本文关键字:bad 状态 什么      更新时间:2023-10-16

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

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

来源

是什么导致流"失去完整性"并进入bad状态?这与fail状态不同,后者通常发生在输入流试图将值存储到无法接受所述值的变量中时(例如,试图将字符串存储到整数变量中)。

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

根据cppreference.com:

标准库在以下情况下设置坏比特:

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

  • 通过operator<<std::put_moneystd::put_time,无法完成,因为输出结束流已到达(facet的格式化输出函数,如num_put::put()money_put::put()返回迭代器iteriter.failed()==true

  • 流是用rdbuf()的空指针构造的,或者putback()/unget()在具有空rdbuf()或传递给operator<<(basic_streambuf*) 的空指针

  • rdbuf()->sputbackc()rdbuf()->sungetc()返回traits::eof()putback() or取消()`

  • rdbuf()->pubsync()sync()flush()或CCD_ 25在CCD_ 26流上的析构函数

  • 的任何成员函数在I/O操作期间引发异常相关联的流缓冲器(例如sbumpc()xsputn()sgetc()overflow()等)

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


这可能是选择cppreference.com而不是www.cpluplus.com的另一个原因,请参阅:cplusplus.com怎么了?

查看Apache C++标准库用户指南。这里列出了造成坏消息的两个潜在原因。我引用:

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

底层流缓冲区抛出异常:流缓冲区可能会失去完整性,如内存不足、代码转换失败或外部设备出现不可恢复的读取错误。流缓冲区可以通过抛出异常来指示这种完整性的损失,该异常被流捕获并导致在流的状态中设置坏比特。