Otto: Verständnisproblem C++ ios_base::failbit

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

  1. 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

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. 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