?
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
/*
failbit wird bei Logikfehler gesetzt: Wenn
-die Daten nicht zum geforderten Datentypen passen.
-versucht wird, etwas zu lesen, das es nicht gibt.
-das Stream-Objekt nicht mit der angegebenen Datei verbunden werden konnte.
(Achtung: Wird nicht gesetzt, wenn man vergisst, eine Datei anzugeben. Falle: !stream ---> .is_open() verwenden)
*/
/*
eofbit wird gesetzt, wenn versucht wird, über das letzte Zeichen hinaus zu lesen.
*/
/*
badbit wird bei Nicht-Logikfehler gesetzt: Wenn z.B. eine Exception fliegt.
*/
/*
Nicht-zeichenweise lesen: operator>> --> ignoriert standardmäßig Leerzeichen, Tabs und Zeilenumbrüche.
Zeichenweise lesen: get --> ignoriert sie nicht.
*/
/*
Wenn fail oder bad true ist, schlagen alle weiteren Leseoperationen fehl.
Du musst den stream dann resetten (clear) und ggf. Zeichen verwerfen (ignore).
*/
void status(const istringstream& iss)
{
cout << endl;
cout << "good = " << iss.good() << endl; // true, wenn eof und bad und fail alle false sind.
cout << "bad = " << iss.bad() << endl;
cout << "fail = " << iss.fail() << " == " << !iss << endl; // ist das Gleiche wie !iss
cout << "eof = " << iss.eof() << endl;
}
int main()
{
char c;
int i;
cout << endl << "1. Erwartung";
{
istringstream iss( "A 1"); // Simuliert eine Datei
iss >> i;
status( iss ); // fail=true, da int erwartet, aber char bekommen.
}
cout << endl << "2. Zeichenweise lesen";
{
istringstream iss( "A 1");
iss.get(c);
iss.get(c);
iss.get(c); // Nun wurden alle Daten gelesen.
status( iss ); // good=true
iss.get(c);
status( iss ); // eof=true, da über das Ende gelesen. fail=true, es wurde versucht etwas zu lesen, das es gar nicht gibt.
}
cout << endl << "3. Nicht-zeichenweise lesen";
{
istringstream iss( "A 1");
iss >> c >> i; // Nun wurden alle Daten gelesen.
status( iss ); // Nur eof=true. fail=false, es wurde nicht über das Ende hinausgelesen.
}
}