Stringstream Datei einlesen Problem

BLR

Erfahrenes Mitglied
Hallo zusammen :)

ich möchte eine Zeile aus einer Textdatei einlesen, die so aussieht:
1;7/1/1962 ;3/1/1997 ;1;"05";"007";"2110 WEST WALNUT";"Rogers";"AR";"72756";"Supercenter"

Jede einzelne Angabe ist mit einem Semikolom getrennt.
Die Angaben stehen in Gänstefüßchen.

Damit ich mit Separatoren umgehen kann, habe ich folgendes geschrieben:


C++:
while (!datei.eof()) {         
            std::getline(datei, zeile);
            stringstream ss(zeile);                 
            while (!ss.eof()) {
                std::getline(ss, wort, ';');              
            
            }
}

Das hat bisher ganz gut geklappt. Ich dachte ich kann so jede Datei mit Seperatoren einlesen.
In diesem Fall aber habe ich ein Problem mit Gänsefüßchen.
Nach dem stringstream nach dem ";" getrennt hat bleibt bei der ersten Angabe anstatt "05"
einfach: \\
Ich habe die Datei in verschiedene Zeichensätze umgewandelt aber das bringt nichts.
Was könnte das sein?
Danke für jeden Tipp.
 
ups....sorry.
Ich meinte, ich möchte der Zeile:
1;7/1/1962 ;3/1/1997 ;1;"05";"007";"2110 WEST WALNUT";"Rogers";"AR";"72756";"Supercenter"

Jeden mit Semikolon getrennten Wert in eine Variable packen.
Dafür habe ich eine kleine Funktion geschrieben, die mit Semikolon im Stringstream splitet.
Problem dabei ist, sobald ich auf die Werte mit Gänsefüßchen stoße, ließt er nicht den gesplitteten Wert "05" aus
sondern Zeichensatz von \\
also so, wie es steht, er verliert die Gänsefüßchen und den Inhalt von Gänsefüßchen und schreibt stattdessen 2xBackslash.
 
Hm.
Mir ist da nur nicht ganz klar, wo überhaupt irgendein Backslash herkommen soll.
Kannst du die Originaldatei einmal hier anhängen (als Datei, nicht reinkopiert)?
Und vllt. den Einlesecode in ein kleines Testprogramm verpackt, genau so wie du es verwendest?

Mit Zeichensätzen sollte das jedenfalls überhaupt nichts zu tun haben.

Btw., statt sowas:
C++:
while (!datei.eof())
    std::getline(datei, zeile);
ist folgendes fast immer besser:
C++:
while (std::getline(datei, zeile))
Es gibt nämlich auch getline-verhindernde Sachen, die kein Eof sind.
 
Ja ich hänge sie gerne an.
Ich weiss auch nicht, wieso er beim Splitten "40" (oder was anderes in Gänsefüßchen") als \\ interpritiert.
Hier kannst du die Datei runterladen:
 

Anhänge

  • land.txt
    299,6 KB · Aufrufe: 24
Zuletzt bearbeitet:
Hallo BLR,
ich habe deine Datei gedownloaded und deinen Code getestet. Ich musste zwar noch dies und das ergänzen, aber dein Code lief fehlerfrei. Bei mir gibt er leider/zum Glück statt >>\\<< die eigentlichen >>"05"<< aus. Ich habe das Testprogramm noch etwas modifiziert, weil ich das Einlesen in einer Hilfsfunktion haben wollte :D.
Ich bin auf Ubuntu 14.04 LTS 64-Bit und habe untenstehenden Code ausgeführt. Einen Screenshot meiner Ausgabe habe ich auch angehängt.
C++:
#include <iostream>
#include <fstream>          // for std::fstream
#include <string>           // for std::string
#include <sstream>          // for std::stringstream
#include <vector>           // for std::vector


auto splitString(const std::string& toSplit, const char sepCharacter) -> std::vector<std::string> {

    std::stringstream toSplitStream(toSplit);
    std::string currentSection;
    auto splitElements = decltype(splitString({}, {})) {};

    while(std::getline(toSplitStream, currentSection, sepCharacter)) {

        splitElements.push_back(currentSection);
    }

    return splitElements;
}


int main()
{
    std::fstream inputFile;
    std::string currentLine;

    auto splitLineElements = decltype(splitString({}, {})) {};
    auto splitLines = std::vector<decltype(splitLineElements)> {};

    inputFile.open("land.txt", std::fstream::in); // TODO: Exception handling

    while (std::getline(inputFile, currentLine)) {

        splitLineElements = splitString(currentLine, ';');
        splitLines.push_back(splitLineElements);
    }

    inputFile.close();

    // check second line
    for (auto& elemIt : splitLines.at(1))
        std::cout << elemIt << std::endl;

    // check especially if "05" is correct
    std::cout << "---\nthis should be \"05\": " << splitLines.at(1).at(4) << std::endl;

    return 0;
}
Ich kann mich da sheel eigentlich nur anschließen, warum sollte eine Funktion, die Stringbereiche lediglich trennt plötzlich Zeichen manipulieren (also die Zahlwerte verändern)?
Hast du vielleicht mit den Strings vor der Ausgabe noch etwas getan? Z.B. zwischen verschiedenen Zeichencodierungen umgewandelt? Sonst kann ich es mir wirklich nicht erklären, tut mir leid :(.

Am hilfreichsten wäre wirklich der ganze Code, oder zumindest mehr davon.

Grüße Technipion
 

Anhänge

  • fehlerfrei.png
    fehlerfrei.png
    4,8 KB · Aufrufe: 20
ahhh ich hab hier etwas für Verwirrung gesorgt, es funktioniert alles.
Nur während des Debuggens hab ich einfach kurz geschaut, ob der Wert drin ist.
Und da zeigt mir komischeweise \\ statt "05" an. Da hab ich gedacht, es wäre das nicht in Ordnung, sorry

Die Sache ist, nun will ich die Gänsefüßchen entfernen:

C++:
string tmp;
for (int i = 1; i < sizeof (st) / sizeof (string) - 1; i++) {
        tmp[i] = this->st[i];

    }

aber das funktioniert nicht. Beim Debugger sehe ich: \\
und die size von "st" kann ich davon auch nicht bestimmen.....
Ich verstehe nicht, wieso der iostream das schon richtigerweise darstellt aber im Prog selbst ist: \\ zu sehen und das hindert mich am Weiterkommen
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück