The message corrected:
It is the 0 that made me asking. Does it mean that it is guaranteed that
good() is true when goodbit has the value 0, on all systems? Also does
this apply to the rest iostates, badbit, eofbit, and failbit, that the
OK setting is the value 0?
So, can we just use it in the style:
#include <iostream>
void iocopy()
{
using namespace std;
char c;
while(!cin.goodbit)
{
cin.get(c);
cout<< c;
}
}
int main()
{
iocopy();
}
In my system (Linux) the above code hangs (infinite loop) on EOF
(Ctrl-D), but the code:
#include <iostream>
void iocopy()
{
using namespace std;
char c;
while(cin.good())
{
cin.get(c);
cout<< c;
}
}
int main()
{
iocopy();
}
does not hang.
The code:
#include <iostream>
void iocopy()
{
using namespace std;
char c;
cout<< boolalpha;
cout<< "\ncin.good()= "<< cin.good()<< endl
<< "cin.goodbit= "<< cin.goodbit<< endl
<< "cin.badbit= "<< cin.badbit<< endl
<< "cin.eofbit= "<< cin.eofbit<< endl
<< "cin.failbit= "<< cin.failbit<<endl;
do
{
cin.get(c);
cout<< c;
}while( cin.good() );
cout<< "\ncin.good()= "<< cin.good()<< endl
<< "cin.goodbit= "<< cin.goodbit<< endl
<< "cin.badbit= "<< cin.badbit<< endl
<< "cin.eofbit= "<< cin.eofbit<< endl
<< "cin.failbit= "<< cin.failbit<<endl;
}
int main()
{
iocopy();
}
reveals:
[john@localhost src]$ ./foobar-cpp
cin.good()= true
cin.goodbit= 0
cin.badbit= 1
cin.eofbit= 2
cin.failbit= 4
1
1
1
1
cin.good()= false
cin.goodbit= 0
cin.badbit= 1
cin.eofbit= 2
cin.failbit= 4
[john@localhost src]$
I entered '1' twice from keyboard and then pressed Ctrl-D. My system is
CentOS 5.0 x86.
[john@localhost src]$ g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-libgcj-multifile
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada
--enable-java-awt=gtk --disable-dssi --enable-plugin
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre
--with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)
[john@localhost src]$
Conclusions: In my system, it looks like goodbit is 0 before input and
remains 0 after EOF, the other "*bits" are non-zero before input and
retain their values after EOF, while good() changes after EOF.
Am I missing something here?