[solved] istream_iterator - letzte Eingabe wird geschluckt
-
Krug zum Gruße,
ich lese gerade den C++ Primer und bin gerade bei den iostream-iteratoren angelangt.
Mithilfe eines kleinen Programms wollte ich mir die Funktionsweise ein wenig verdeutlichen.
#include <iostream> #include <string> #include <cstdlib> #include <iterator> int main (int argc, char ** argv) { std::istream_iterator<std::string> iIterator(std::cin), eofIterator; std::ostream_iterator<std::string> oIterator(std::cout,"\n"); while (iIterator!=eofIterator && *iIterator!="exit") *oIterator++ = *iIterator++; return EXIT_SUCCESS; }Gebe ich hier beispielsweise folgendes ein: "Ich teste mal ein wenig.", so wird allerdings der letzte string "wenig." nicht ausgegeben. Erst nach erneuter Eingabe erfolgt dann die Ausgabe.
Mir ist allerdings nicht ganz klar, warum das so ist. Hätte da jemand eine kurze Erläuterung parat?
-
edit (mit dem debugger vll doch nicht all zu einfach nachzuvollziehen, warum er aus dem fkt-aufruf nicht wieder zurückkehrt):
istream_iterator::operator++()
liest - wenn er "am ende" des streams angekommen ist, einen neuen wert ein - wartet also auf deine nächste eingabe.
istream_iterator::operator++(int)(den du ja aufrufst) ist üblicherweise so implementiert:class_x class_x::operator++(int) { class_x ret_val = *this; //kopie machen ++*this; //aufruf des operator++() return ret_val; }class_x ist in deinem fall nat. istream_iterator.
die richtige lösung wäre also:
for(; iIterator != eofIterator && *iIterator != "exit"; ++iIterator) { *oIterator++ = *iIterator; }wenn wir schon mal dabei sind, könnte man
std::istream_iterator<std::string> iIterator(std::cin), eofIterator;auch in den kopf der for-schleife schreiben - ich würds zumindest so in der Richtung machen:
typedef std::istream_iterator<std::string> i_iterator_t; typedef std::ostream_iterator<std::string> o_iterator_t; o_iterator_t o_iterator(std::cout, "\r\n"); int main() { for(i_iterator_t i(std::cin), eof; i != eof; ++i) { if(*i == "exit") break; *o_iterator++ = *i; } }aber da gibts sicherlich auch andere meinungen.
bb
-
Herzlichen Dank für die Erläuterung.
Daran, dass beim post-increment ein weiterer Wert eingelesen wird habe ich garnicht gedacht.Nun habe ich es entsprechend deinen Vorschlägen geändert (wird im Kopf eine for-Schleife inkrementiert) und es funktioniert einwandfrei.
Nochmals herzlichen Dank für den Hinweis.