Sie ss
Wiederverwendung aber nicht korrekt zurückgesetzt wird. Wenn Sie das zweite Wort aus der ersten Zeile extrahieren, ist der Stream erschöpft und in einen "EOF" -Zustand versetzt. Wenn Streams in diesem oder einem anderen "Fehler" -Zustand sind, tun sie nichts. Sie müssen den Fehler löschen, bevor Sie sie weiter verwenden können.
Wenn Sie waren auf Fehler von operator<<
und getline
in der Schleife zurück zu überprüfen (oder wenn Sie ss
verursachen waren Ausnahmen auf Fehler werfen *) würden Sie finden sie an, dass sie nach der ersten Iteration nicht erfolgreich sind. Es ist eine gute allgemeine Praxis, immer auf Fehler zu prüfen, insbesondere wenn Sie debuggen.
können Sie den Fehler beheben, indem Sie Ihre Schleife zu ändern:
while (std::getline(infile, current_line)) {
ss.clear(); // clears the error, not the contents
ss << current_line;
jedoch tut dies bedeutet, dass ss
alle Linien in seinem internen Puffer ansammeln. Der Code erzeugt die erwartete Ausgabe, es sei denn, die Datei ist groß und Sie haben nicht genügend Arbeitsspeicher oder ähnliches.
Sie können die anfall internen Puffer sehen mit den folgenden:
while (std::getline(infile, current_line)) {
ss.clear();
ss << current_line;
std::cout << "ss internal buffer: " << ss.str();
Statt die formatierte Eingabe der Verwendung ss
hinzufügen Sie sind wahrscheinlich besser mit dem .str()
Mitglied es zu setzen, was die vorherigen Daten ersetzen anstatt es hinzuzufügen.
while (std::getline(infile, current_line)) {
ss.clear();
ss.str(current_line);
Alternativ können Sie eine neue stringstream
in jeder Iteration der Schleife konstruieren. Dies stellt sicher, dass keine Fehlerzustände oder Daten von vorherigen Iterationen übertragen werden. Es kann auch langsamer sein, aber Sie müssen das für sich selbst profilieren.
while (std::getline(infile, current_line)) {
std::stringstream ss(current_line);
* Ausnahmen sind nett, weil man sich nicht daran erinnern müssen, um zu überprüfen ... außer in Fällen wie diesen, wo sie standardmäßig nicht aktiviert. Auch habe ich bemerkt, dass einige C++ - Implementierungen Fehler in ihrem Iostreams-Ausnahmecode haben, weil die Leute es nicht oft verwenden.
Warum sind 'ss',' tempProxy' und 'tempPort' im äußeren Bereich? Warum ist 'ss' nicht' std :: istringstream' einfach aus 'current_line' aufgebaut? – LogicStuff
Das ist seltsam, ich dachte, den Stringstream einmal außerhalb der Schleife zu konstruieren und den Operator >> zu verwenden, um einen neuen Stream zu füttern, wäre effizienter, als ihn bei jedem Durchgang durch die Schleife zu konstruieren. – mocode9