istream ostream . ios, istream ostream, public-, :
inline int ios:: bad () const { return state & badbit; }
inline int ios:: eof () const { return state & eofbit; }
inline int ios:: fail () const { return state & (badbit | failbit); }
inline int ios:: good () const { return state == 0; }
, ios:
public:
enum io_state { goodbit = 0x00,
eofbit = 0x01,
failbit = 0x02,
badbit = 0x04 };
goodbit eofbit, . goodbit, . eofbit, . failbit badbit . failbit , , . badbit .
ios , (rdstate) (clear) :
inline int ios:: rdstate () const { return state; }
inline void ios:: clear (int _i=0){ lock(); state = _i; unlock(); }
, , / , clear().
#include <iostream>
using namespace std;
int main()
{ int i, flags;
char c;
do{ cin >> i;
flags=cin.rdstate(); // cin
if(flags & ios::failbit)
{ cout << "error in stream"<< endl;
cin.clear(0); //
cin>>c; // int
}
else cout << i<<endl;
} while(flags); //
return 0;
}
cin.clear(0) . , , badbit, clear(ios::badbit). , .
#include <fstream>
#include <iostream>
using namespace std;
int main()
{ ifstream in("file");
int state;
char ss[10];
while(1)
{ state=in.rdstate(); // in ()
if (state) //
{ if(state&ios::badbit) cout<<" "<<endl;
else if(state&ios::eofbit) cout<<" "<<endl;
return 0;
}
else in >> ss;
}
}
, ios !:
inline int ios::operator!() const { return state&(badbit|failbit); }
! badbit failbit, , :
if(!cin) cout << cin<<endl; //
else cin>>i; //