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, alsscanf
definiert 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::isspace
prü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