iostream: stream states


  • Mod

    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 hat
    

    100% 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 template vonstatten 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.


  • Mod

    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::iostate machen 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.


Anmelden zum Antworten