istream und std::string
-
Hi zusammen,
ich frage mich gerade, wie
std::istream is; std::string s; is >> s;Wie lange wird da tatsächlich gelesen? Bis zum Streamende oder bis zu 0x00, 0x0a, 0x0d? Was könnte da die Terminalzeichen sein, ich finde im Netz nichts dazu.
PS:
Ich weiß, dass esgetline()gibt, mir geht's hier explizit um den >> Operator.
-
@DocShoe https://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt meinst du das unter 2?
-
Ja, genau das, Danke.
-
@Schlangenmensch sagte in istream und std::string:
@DocShoe https://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt meinst du das unter 2?
Interessant. Das liest sich für mich, als könne der Operator auch Strings erzeugen, die mittendrin ein
\0-Zeichen haben können, oder? Das muss man evtl. bedenken, wenn man lustige Inputs hat.
-
@Finnegan sagte in istream und std::string:
Interessant. Das liest sich für mich, als könne der Operator auch Strings erzeugen, die mittendrin ein
\0-Zeichen haben können, oder? Das muss man evtl. bedenken, wenn man lustige Inputs hat.So ist es: https://ideone.com/GxuaVa
-
wurgs, das ist ja übel o.O. An Whitespaces wird aufgehört zu lesen, aber non-printable werden übernommen?
-
Philosophisch wird das wohl daher kommen, dass formatierter Input/Output annimmt, dass das ein menschenartiger Text , kein Maschinentext ist.
Oder dass die Unterscheidung von Kontrollzeichen und grafischen Zeichen (du wünscht dir ja
isgraph, oder?) nicht wirklich etwas war, das 1970 an einem Terminal relevant war, alsscanfdefiniert wurde, an dessen Spezifikationen sich das orientiert.
-
@SeppJ
Ne, ich wünsche mir garnichts
Ich habe eine utf8-string Klasse, für die ich jetzt die Streaming Operatoren so überladen möchte, dass sie sich genauso wie die std::string Pendants verhalten.
-
@SeppJ @DocShoe sagte in istream und std::string:
wurgs, das ist ja übel o.O. An Whitespaces wird aufgehört zu lesen, aber non-printable werden übernommen?
Ja, das ist wieder so ein C++-Ding das ich leider für sehr inkonsistent und gefährlich unintuitiv halte. Whitespace-Trennung ist für mich ziemlich "high-level". Ich habe keine Probleme mit beliebigen Chars in Strings, aber wenn ich eh noch nach Steuerzeichen filtern muss, dann kann ich da auch genau so gut selbst noch eine Wort-Trennung implementieren.
Also entweder "low-level" und der
operator>>liest komplett bis zum Ende des Streams, oder "high-level" und dann nicht nur aufstd::isspaceprüfen, sondern auch aufstd::iscntrl.
-
@DocShoe sagte in istream und std::string:
Ne, ich wünsche mir garnichts
Ich habe eine utf8-string Klasse, für die ich jetzt die Streaming Operatoren so überladen möchte, dass sie sich genauso wie die std::string Pendants verhalten.Aber utf-8 ist doch super, da ist doch immer das erste Bit gesetzt bei jedem continuation-Byte. Ein ASCII-Leerzeichen ist also auch in UTF-8 ein Leerzeichen und (wichtig) umgekehrt gilt auch, dass ein nicht-Leerzeichen niemals ein Leerzeichen ist. Solange du dich in 7-bit-ASCII bewegst, musst du gar nichts machen

-
@wob sagte in istream und std::string:
@DocShoe sagte in istream und std::string:
Ne, ich wünsche mir garnichts
Ich habe eine utf8-string Klasse, für die ich jetzt die Streaming Operatoren so überladen möchte, dass sie sich genauso wie die std::string Pendants verhalten.Aber utf-8 ist doch super, da ist doch immer das erste Bit gesetzt bei jedem continuation-Byte. Ein ASCII-Leerzeichen ist also auch in UTF-8 ein Leerzeichen und (wichtig) umgekehrt gilt auch, dass ein nicht-Leerzeichen niemals ein Leerzeichen ist. Solange du dich in 7-bit-ASCII bewegst, musst du gar nichts machen

Spitze! Da habe ich zu kompliziert gedacht. Naja, immerhin etwas über C++ I/O gelernt
