在C ++中,每个流都有一个bad
位:
此标志由在读取或写入数据时发生错误时对流执行的操作设置,通常会导致流的完整性丢失。
什么会导致流“失去完整性”并进入bad
状态?这与fail
状态不同,当输入流尝试将值存储到不能接受所述值的变量(例如尝试将字符串存储到整数变量中)时,最常出现这种情况。 / p>
请注意,此问题是c++ file bad bit的更一般形式,特定于文件输入流;这个问题并不完全重复,因为它通常适用于输入和输出流。
答案 0 :(得分:13)
标准库在以下情况下设置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。