Verständnisproblem C++ ios_base::failbit
Otto
- programmiertechnik
Hi alle,
ich lese in einem C++ Programm aus einer Datei zeilenweise ein, um auf Fehler zu reagieren habe ich die Bitmaske für Exceptiones auf ios_base::failbit | ios_base::badbit gesetzt.
Am Ende der Datei wird immer eine Exception ausgelöst, aber warum? Das Bit für EOF ist doch nicht gesetzt. Setzte ich die Bitmaske nur auf ios_base::badbit läuft alles prima. In meinen Büchern finde ich nur das failbit für, die letzte Ein- oder Ausgabeoperation war fehlerhaft, steht. Kann das so nicht nachvollziehen, wäre schön wenn mir einer auf die Sprünge helfen kann.
Ich habe das ganz unter Linux mit dem gcc 4.3.1 übersetzt. Hier mal mein Code:
int
main ( int argc, char *argv[] )
{
cout << "\nProgramm " << argv[0] << endl << endl;
string ifs_file_name = "test.txt"; /* input file name */
ifstream ifs; /* create ifstream object */
ifs.exceptions( ios_base::failbit | ios_base::badbit );
ifs.open (ifs_file_name.c_str()); /* open ifstream */
if (!ifs) {
cerr << "\nERROR : failed to open input file " << ifs_file_name << endl;
}
string line;
while ( getline(ifs, line)){
cout << line << endl;
}
ifs.close (); /* close ifstream */
return 0;
} // ---------- end of function main ----------
MfG
Otto
Hello,
Hi alle,
ich lese in einem C++ Programm aus einer Datei zeilenweise ein, um auf Fehler zu reagieren habe ich die Bitmaske für Exceptiones auf ios_base::failbit | ios_base::badbit gesetzt.
Am Ende der Datei wird immer eine Exception ausgelöst, aber warum? Das Bit für EOF ist doch nicht gesetzt. Setzte ich die Bitmaske nur auf ios_base::badbit läuft alles prima. In meinen Büchern finde ich nur das failbit für, die letzte Ein- oder Ausgabeoperation war fehlerhaft, steht. Kann das so nicht nachvollziehen, wäre schön wenn mir einer auf die Sprünge helfen kann.
Das ist richtig. Das Failbit wird auch verglichen, wenn EOF erreicht ist und deshalb nicht weitergelesen werden kann. Das EOF-Bit bedarf hingegen keines gesetzten Failbits. Siehe auch:
http://www.greenend.org.uk/rjk/2000/10/iostream.html
Außerdem musst Du daran denken, die Fehlerbits im Exception-Handler wieder zurückzusetzen, wenn Du im selben Programm nochmal damit arbeiten willst.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi Tom,
danke für deine Unterstützung.
Außerdem musst Du daran denken, die Fehlerbits im Exception-Handler wieder zurückzusetzen, wenn Du im selben Programm nochmal damit arbeiten willst.
Besonderen Dank für diesen Tipp. Das wäre bestimmt die nächste Falle in die ich gelaufen wäre.
MfG
Otto