views:

295

answers:

1

I am overloading the input stream operator for use with a Time class and would like to manually set the failbit of the input stream if the input doesn't match my expected time format (hh:mm). Can this be done? How?

Thanks!

+8  A: 

Yes, you can set it with ios::setstate, like so:

#include <iostream>
#include <ios>

int main()
   {
   std::cout << "Hi\n";

   std::cout.setstate(std::ios::failbit);

   std::cout << "Fail!\n";
   }

The second output will not be produced because cout is in the failed state.

(An exception seems cleaner to me, but YMMV)

Jack Lloyd
It also works for input streams as asked.
Charles Bailey
Yes, both input and output streams are derived from ios and ios_base
Jack Lloyd
I think that setting the `failbit` is a very valid approach to reporting streaming errors as client code can use the same `if (in >> val) { /* success */ }` idiom that they can use for basic types.
Charles Bailey
Setting the fail bit is probably better than an exception as it mirrors how the standards types play with the stream.
Martin York