2017-01-08 5 views
1

Ich habe eine Textdatei mit einer Reihe zwei Strings durch einen Doppelpunkt in jeder Zeile begrenzt.C++ Stringstream nur erste Zeichenfolge abholen

Ich benutze getline, um die gesamte Zeile dann String-Stream zu greifen, um die zwei Strings zu teilen und sie auf einen Vektor zu setzen. Der Code funktioniert beim ersten Durchgang, in dem er die Saiten perfekt erfasst, einwandfrei. Danach, nach dem 2. Durchlauf der while-Schleife usw., greift es nicht auf den neuen Eingang. Der String-Stream scheint aus irgendeinem Grund die ursprünglichen ersten Werte zu belassen.

Irgendeine Idee, warum es die Strings von current_line bei jedem Durchlauf nicht mit Ausnahme der ersten Iteration greifen möchte?

+0

Warum sind 'ss',' tempProxy' und 'tempPort' im äußeren Bereich? Warum ist 'ss' nicht' std :: istringstream' einfach aus 'current_line' aufgebaut? – LogicStuff

+0

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

Antwort

2

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.

0

Ich glaube, Sie suchen so etwas wie:

if (infile.is_open()) { 
    std::stringstream ss; 
    std::string current_line; 
    std::string tempProxy; 
    std::string tempPort; 

    while (std::getline(infile, current_line)) { 
     std::stringstream to_split; 
     to_split.str(current_line); 
     std::getline(to_split, tempProxy, ':'); 
     std::getline(to_split, tempPort); 
     std::cout << tempProxy << " and " << tempPort << std::endl; 
    } 
+0

Das ist seltsam, ich dachte, den Stringstream einmal außerhalb der Schleife zu konstruieren und den Operator >> zu verwenden, um ihm einen neuen Stream zuzuführen, wäre effizienter, als ihn bei jedem Durchgang durch die Schleife zu konstruieren. Aber es scheint nur auf Ihre Art und Weise zu funktionieren. – mocode9

Verwandte Themen