In C++, each stream has a bad
bit:
This flag is set by operations performed on the stream when an error occurs while read or writing data
Take a look at the Apache C++ Standard Library User's Guide. Two potential causes for a badbit are listed there. I quote:
Memory shortage: There is no memory available to create the buffer, or the buffer has size 0 for other reasons (such as being provided from outside the stream), or the stream cannot allocate memory for its own internal data.
The underlying stream buffer throws an exception: The stream buffer might lose its integrity, as in memory shortage, or code conversion failure, or an unrecoverable read error from the external device. The stream buffer can indicate this loss of integrity by throwing an exception, which is caught by the stream and results in setting the badbit in the stream's state.
According to cppreference.com :
The standard library sets badbit in the following situations:
Insertion into the output stream by
put()
orwrite()
fails for any reason.Insertion into the output stream by
operator<<
,std::put_money
orstd::put_time
, could not complete because the end of the output stream was reached (The facet's formatting output function such asnum_put::put()
ormoney_put::put()
, returns an iteratoriter
such thatiter.failed()==true
)Stream is constructed with a null pointer for
rdbuf()
, orputback()
/unget()
is called on a stream with a nullrdbuf()
, or a null pointer passed tooperator<<(basic_streambuf*)
rdbuf()->sputbackc()
orrdbuf()->sungetc()
returntraits::eof()
toputback() or
unget()`
rdbuf()->pubsync()
returns -1 tosync()
, toflush()
, or to the destructor ofostream::sentry
on aunitbuf
streamException is thrown during an I/O operation by any member function of the associated stream buffer (e.g.
sbumpc()
,xsputn()
,sgetc()
,overflow()
, etc)Exception is thrown in
iword()
orpword()
(e.g.std::bad_alloc
)
This may be one more reason to choose cppreference.com over www.cpluplus.com, see: What's wrong with cplusplus.com?