13

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

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

来源

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

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

4

2 回答 2

14

根据cppreference.com

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

  • 因任何原因插入输出流put()或失败。write()

  • operator<<由于到达了输出流的末尾,通过std::put_money或 向输出流中的插入std::put_time无法完成(构面的格式化输出函数,例如 num_put::put()or money_put::put(),返回一个迭代器iter,使得iter.failed()==true

  • Stream 是用一个 null 指针构造的rdbuf(),或者 putback()/unget()在一个带有 null 的流上被调用rdbuf(),或者一个 null 指针传递给operator<<(basic_streambuf*)

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

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

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

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


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

于 2012-08-28T14:47:58.330 回答
1

查看Apache C++ 标准库用户指南。那里列出了两个潜在的错误原因。我引用:

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

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

于 2012-08-28T14:51:43.083 回答