iostream: stream states
-
Ruvi schrieb:
manni66 schrieb:
1+2=3
Das Fail- und das Eofbit sind gesetzt. Wenn deine Datei am Ende keinen Zeilenumbruch hat, wird bis zum Dateiende gelesen, deshalb ist EOF schon gefunden.o_O
Er addiert die States?
Wenn nach eofbit ein badbit kommt ist der State dann 5 ?
Wie baut man denn dann solide Abfragen?Nein, er verodert die einzelnen States. Und das ist auch der Grund warum das nur die Zweierpotenzen sind. Zufällig sieht dann die Oder-Operation so aus wie ein Plus.
Und du kannst dir die einzelnen States mit einem Und wieder da raus holen:
enum { GOOD = 0, EOF = 1, FAIL = 2, BAD = 4 }; int flags = EOF | BAD; if ( flags == GOOD ) { } else { if ( flags & EOF == EOF ) {} if ( flags & FAIL == FAIL ) {} if ( flags & BAD == BAD ) {} }
-
Gute Funktion. Könnte in die FAQ rein.
Wie wäre es mit
#include <iostream> std::ios& print_state( std::ios& is ) { std::ostream& out = (&is == &std::cout? std::clog : std::cout); // Falls cout das failbit gesetzt hat if (is.good()) out << "good"; else { if (is.bad()) out << "*bad* "; if (is.eof()) out << "eof "; if (is.fail()) out << "fail "; } out << '\n'; return is; } int main() { std::cout << print_state; std::cin >> print_state; }
-
Arcoth schrieb:
std::cin >> print_state;Semkantik daneben!?
-
Arcoth schrieb:
std::ios& print_state( std::ios& is )Super nützlicher Rückgabewert!
Arcoth schrieb:
std::ostream& out = (&is == &std::cout? std::clog : std::cout); // Falls cout das failbit gesetzt hat100% POLA-konform!
Arcoth schrieb:
out << "*bad* ";*bad* bedarf ganz sicher besondere Aufmerksamkeit.
Die Leerzeichen sind sicher auch sehr nützlich vor dem Linebreak
Arcoth schrieb:
out << '\n';der in jede unscheinbare Ausgabefunktion hineingehört.
Arcoth schrieb:
std::cout << print_state << '\n';Compile error. Aha, deshalb das
'\n'. POLA ftw.Arcoth schrieb:
std::cin >> print_state;Ok, ich gebs auf. Da läuft was ganz grundsätzlich schief.
-
Wundert mich eh, daß es ohne
templatevonstatten ging.
-
thedailywtf schrieb:
Arcoth schrieb:
std::cout << print_state << '\n';Compile error. Aha, deshalb das
'\n'. POLA ftw.Eigentlich kein Comile error. Höchstens, wenn Du den komischen Rückgabetyp geändert hättest.
-
thedailywtf schrieb:
*bad* bedarf ganz sicher besondere Aufmerksamkeit.
Ja, warum nicht? Deutet schließlich auf einen irreparablen Fehler hin und sollte entsprechend gekennzeichnet werden.
thedailywtf schrieb:
Die Leerzeichen sind sicher auch sehr nützlich vor dem Linebreak
Nein, aber es ist ganz nützlich zwischen Wörtern. "eoffail" wäre nicht so lesbar, weißt du.
Falls du dich allerdings auf das eine Leerzeichen in"fail "aufregst, muss ich dir sowohl zu deinen Adleraugen als auch zu deinem Scharfsinn gratulieren.thedailywtf schrieb:
der in jede unscheinbare Ausgabefunktion hineingehört.
Komisch - bei Swordfish's Variante hast du dich nicht beschwert. Diesen Einwand hast du aber vorausgesehen und das Wörtchen unscheinbar eingebaut. Ich muss dir abermals zu deinem Scharfsinn gratulieren!
thedailywtf schrieb:
Compile error
Die Signatur der aufgerufenen Operatorfunktion ist übrigens
basic_ostream& operator<<( std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );Zitieren musst du auch noch lernen.
-
Wenn man es mehr "fancy" haben will...
Könnte man nen Wrapper für
std::ios_base::iostatemachen und für diesen dann nen Stream-Insertion-Operator definieren.Oder der Swordfish Variante nen zusätzlichen Output-Stream Parameter verpassen der zum Output verwendet wird.
Arcoth schrieb:
thedailywtf schrieb:
der in jede unscheinbare Ausgabefunktion hineingehört.
Komisch - bei Swordfish's Variante hast du dich nicht beschwert. Diesen Einwand hast du aber vorausgesehen und das Wörtchen unscheinbar eingebaut. Ich muss dir abermals zu deinem Scharfsinn gratulieren!
Swordfish's Variante ist eine benannte Funktion. Bei benannten Funktionen kommt es schonmal vor dass die nen "\n" rausschreiben.
Bei einem Stream-Operator bzw. -Manipulator erwartet man es aber eher nicht.
Wobei die eigentliche POLA Verletzung mMn. die ist dass ein Stream-Manipulator nicht "seinen" Stream manipuliert sondern stattdessen auf einem anderen Stream etwas ausgibt.
-
Ihr habt doch alle einen an der Waffel.
-
Kellerautomat schrieb:
Ihr habt doch alle einen an der Waffel.
Ach quatsch, wir sind nur gründlich.
hustbaer schrieb:
Bei benannten Funktionen kommt es schonmal vor dass die nen "\n" rausschreiben.
Gemeint war natürlich '\n'.

-
volkard schrieb:
hustbaer schrieb:
Bei benannten Funktionen kommt es schonmal vor dass die nen "\n" rausschreiben.
Gemeint war natürlich '\n'.

Verstehe ich nicht.
Was ist da der (relevante) Unterschied?
-
hustbaer schrieb:
volkard schrieb:
Gemeint war natürlich '\n'.

Was ist da der (relevante) Unterschied?
Vergiss es. Volkard will mich bloß verarschen.