[C++] Einlesen von Dateien mit Umlauten

AMD-Hammer

Grand Admiral Special
Mitglied seit
05.10.2003
Beiträge
2.760
Renomée
123
Standort
Bornheim (Rheinland)
Hallo zusammen,

ich bin jetzt schon seit Stunden auf der Suche und verzweifle jetzt langsam echt daran. *motz*

Ich habe eine C++ Anwendung geschrieben, die als Dienst auf einem Debian (4.0) Server läuft und regelmäßig Dateien, die in einem bestimmten Ordner abgelegt werden in eine MySQL Datenbank importiert. Bei den Dateien handelt es sich um txt-Dateien, die Tabulator-getrennte Werte enthalten.
Ich dachte eigentlich, dass ich inzwischen schon fertig war, da der Dienst die letzten fünf Tage ohne Probleme lief und die Daten korrekt in die Datenbank geschrieben hat. Doch heute Nacht habe ich vom Server eine Mail bekommen mit der Meldung, dass das Programm unerwartet beendet wurde und zwar auf Grund eines "Speicherzugriffsfehler".

Daraufhin habe ich die aktuellen Dateien heruntergeladen und das Programm über den Debugger gestartet. Dieser lief auch die ersten 35 Datensätze ohne Probleme durch, endete sich dann aber mit einer Exception. Leider konnte ich an der Stelle lange nichts finden, bis ich rausgefunden hab, dass an dieser Stelle ein Umlaut (ö) enthalten ist. Daraufhin wollte ich mir die Variable ausgeben lassen (über cout) und habe festgestellt, dass an der entsprechenden Stelle wo der Umlaut stehen müsste der String aufhört. Da er in der Datei korrekt drin steht ist also der Fehler irgendwo im Code. Ich dachte jetzt daran die Codierung der Datei irgendwo einzustellen damit c++ weiß wie er den String einlesen soll. Die Codierung der Datei ist anscheinend ISO-8859-1.

Leider konnte ich nichts entsprechendes finden :(
Habt ihr vielleicht einen Hinweis, wie ich die Codierung fürs einlesen ändern kann?

Anbei mal der Codeschnipsel der zum auslesen der Datei benutzt wird:
Code:
    ifstream DataStream(filename);

    while (getline(DataStream, Record))
    {
        istringstream record(Record);
        string DataItem;

        for (int ColumnCounter = 1; getline(record, DataItem, '\t'); ColumnCounter++) 
        {
            RecordArr[ColumnCounter] = DataItem;
            /**
             * hier passiert noch mehr, was aber nicht von Bedeutung ist...
             */
        }
    }


Vielen Dank im Voraus
Gruß,
AMD-Hammer
 
Also unter Windows XP mit Visual C++ 2008 funktioniert der Code.
 
Ich denke, dass unter Linux die ReadLine Funktion anders ist und nicht nur bei CR oder LF abbricht, sondern auch bei anderen Zeichen. Vielleicht ist das ö im englischen irgendein spezielle Trennzeichen. Probier einmal andere Sonderzeichen.

Auf ein ähnliches Problem bin ich in VB.NET gestoßen, als ich Dateinamen mit Sonderzeichen (tschechisch usw.) bzw. defekten Zeichen einfügen wollte. Da hat er mir dann einfach die Zeichen vermurkst und beim select kamen nachher andere zurück, aber Fehler brachte der keinen.
 
Wir hatten das Problem per ICQ lösen können. Es lag an einem Pufferüberlauf an einer anderen Stelle wenn ich mich richtig erinnere.
 
Zurück
Oben Unten