2013-01-18 9 views
6

Lassen Sie uns sagen, dass ich eine Datei, dieÜberprüfen Sie, ob alle Werte erfolgreich von std :: gelesen wurden istream

100 text 

hat Wenn ich versuche zu lesen 2 Nummern ifstream verwenden, wäre es scheitern, weil text keine Zahl ist. Mit fscanf Ich werde es durch die Überprüfung seines Rückkehrcode fehlgeschlagen wissen:

if (2 != fscanf(f, "%d %d", &a, &b)) 
    printf("failed"); 

Aber wenn Iostream statt stdio verwenden, wie weiß ich es gescheitert?

Antwort

11

Sein eigentlich als (wenn nicht mehr) einfach:

ifstream ifs(filename); 
int a, b; 
if (!(ifs >> a >> b)) 
    cerr << "failed"; 

auf dieses Format Gewöhnen Sie sich, nebenbei bemerkt. wie es in sehr handy (noch mehr-so für die Fortsetzung positive Progression durch Schleifen) kommt.

3

Wenn man‘mit GCC mit -std=c++11 oder -std=c++14 sie auftreten können:

error: cannot convert ‘std::istream {aka std::basic_istream<char>}’ to ‘bool’ 

Warum? Die C++ 11 Standard gemacht bool Operator Aufruf explizit (ref). es ist daher notwendig, zu verwenden:

std::ifstream ifs(filename); 
int a, b; 
if (!std::static_cast<bool>(ifs >> a >> b)) 
    cerr << "failed"; 

persönlich bevorzugen unter Verwendung von fail Funktion I:

std::ifstream ifs(filename); 
int a, b; 
ifs >> a >> b 
if (ifs.fail()) 
    cerr << "failed";