2010-11-17 35 views
21

Ein Kollege hat mir nur gesagt, dass dieser Code:ifstream: überprüfen, ob geöffnet erfolgreich

std::ifstream stream(filename.c_str()); 
if (!stream) 
{ 
    throw std::runtime_error(".."); 
} 

falsch wäre. Er sagte ifstream wertet 0 aus, wenn das Öffnen erfolgreich ist. Mein Code funktioniert, aber ich wollte die Dokumentation finden, konnte aber nicht sehen, wo er nachsehen kann, ob das Öffnen erfolgreich war. Kannst du mich darauf hinweisen?

Antwort

29

operator!is overloaded für std::ifstream, so dass Sie dies tun können.

Meiner Meinung nach ist dies jedoch ein schrecklicher Missbrauch der Betreiberüberlastung (vom Normenausschuss). Es ist viel expliziter, was Sie überprüfen, wenn Sie nur if (stream.fail()) tun.

+6

Vergessen Sie nicht, 'stream.bad()', 'stream.good()', 'stream.fail()' und 'stream.is_open()' zu überprüfen. seufz ... – Inverse

+0

vielen dank für den link! Ich stimme zu, dass es nicht nett ist, die Prüfung mit diesem Operator durchzuführen, also werde ich es ändern. Wir hätten die Diskussion nicht mit if (stream.fail()) geführt. – Philipp

+9

Die! ist überladen, um zu überprüfen, ob 'scheitern' und 'schlecht' –

8

Sie können auch is_open() verwenden, um zu überprüfen, ob es funktioniert hat, aber! erlaubt ist (es ist nicht für Null prüft, ist es ein besonderer overload of !)

edit:
Nur aus Interesse - warum dies nicht eine Ausnahme?
Ist es nur, dass Streams vor Ausnahmen eingeführt wurden
oder sind wir in der alten C++ Sache von - es ist nur ein Fehler nicht außergewöhnlich genug, um eine Ausnahme zu sein.

8

Sie können veranlassen, dass ein bestimmter Stream eine Exception für eof/fail/bad auslöst, indem er seine ios::exceptions()-Funktion mit der richtigen Bitmaske aufruft. So könnte man das Beispiel in der Ausgangsfrage neu zu schreiben, wie oben:

std::ifstream stream; 
stream.exceptions(std::ios::failbit | std::ios::badbit); 
stream.open(filename.c_str()); 

Hier Strom wird eine Ausnahme ausgelöst, wenn die failbit oder badbit gesetzt werden. Wenn zum Beispiel ifstream::open() fehlschlägt, wird das Failbit gesetzt und eine Ausnahme ausgelöst. Natürlich wird dies später eine Ausnahme auslösen, wenn eines dieser Bits im Stream gesetzt wird, also ist dieses Umschreiben nicht genau dasselbe wie das ursprüngliche Beispiel. Sie können

stream.exceptions(std::ios::goodbit); 

aufrufen, um alle Ausnahmen im Stream abzubrechen und zur Überprüfung auf Fehler zurückzukehren.

2

Ihr Kollege ist falsch. Vielleicht hat er vergessen, dass Sie nicht schreiben C.

Der Code ist genau richtig. Es ist genau, wie Sie Stromstatus überprüfen sollten.

Verwandte Themen