wxTextFile::Write()



  • Guten Abend zusammen!

    Ich habe wxSmith für CodeBlocks frisch installiert und mache mich jetzt nach und nach damit (und mit wxWidgets) vertraut. Bisher komme ich ganz gut zurecht, bloß der Einstieg in die Verwendung der Sizer in wxSmith war etwas holprig. 🙂

    Meine Frage dreht sich um das Lesen und besonders das Schreiben von Strings in Dateien. Ich verwende nur wxWidgets-eigene Klassen, im Projekt ist 'unicode enabled'.

    Zuersteinmal das Beispiel "Lesen aus Datei", die Datei sei UTF-8 kodiert und liegt im gleichen Verzeichnis wie die .exe:

    wxString path=_("conf.ini");
    wxTextFile FILE(path);
    bool FILE_exists = FILE.Exists();
    if(FILE_exists==true)
    {
        FILE.Open();
        stringLINE=FILE.GetLine(0);
        FILE.Close();
    }
    

    Soweit so gut. Jetzt ein Beispiel "Schreiben in Datei", die Datei sei schon vorhanden und UTF-8 kodiert:

    wxString path=_("conf.ini");
    wxTextFile FILE(path);
    bool FILE_exists=FILE.Exists();
    if(FILE_exists==true)
    {
        FILE.Open();
        FILE.Clear();
        FILE.InsertLine(_("Textzeile"),0);
        FILE.Write();
    }
    

    Nachdem die Änderungen in der Datei mit Write() gespeichert wurden ist die Datei nun ANSI kodiert.
    Hat wohl damit zu tun dass auf meinem Rechner (WinXP) die Standardkodierung eben ANSI ist und diese beim Speichern der Datei automatisch verwendet wird.
    Gibt es eine Möglichkeit explizit das Speichern in eine UTF-8 kodierte Datei zu erzwingen?

    Tatsächlich habe ich noch eine zweite Frage:
    Nachdem das projekt erstellt wurde kann ich die erstellte .exe Datei aufrufen und die Datei conf.ini (liegt im gleichen Verzeichnis) wird eingelesen.
    Versuche ich aber das gleiche nachdem ich in der CodeBlocks-IDE 'Build & Run' klicke erscheint eine Fehlermeldung die besagt dass die Datei conf.ini nicht gefunden wurde.
    Woran könnte das liegen? Die zu lesende Datei liegt doch im gleichen Verzeichnis wie auch die erstellte .exe.

    LG Alberich



  • Alberich schrieb:

    Nachdem die Änderungen in der Datei mit Write() gespeichert wurden ist die Datei nun ANSI kodiert.
    Hat wohl damit zu tun dass auf meinem Rechner (WinXP) die Standardkodierung eben ANSI ist und diese beim Speichern der Datei automatisch verwendet wird.

    Du hast es erfasst. 😉
    Du musst bei Write() noch einen zusätzlichen (zweiten) Parameter für die Kodierung angeben.
    Der Default-Wert ist wxConvAuto() (was wohl die Standardkodierung des Systems verwendet). Du brauchst eine Instanz der Klasse wxMBConvUTF8 (es gibt bereits eine globale Instanz mit dem Namen wxConvUTF8 ).
    Das heißt, du mußt Zeile 9 in deinem Code auf FILE.Write(wxTextFileType_None, wxConvUTF8) ändern.
    Eventuell musst du diesen Parameter auch bei Open() verwenden. Probiers einfach.

    Alberich schrieb:

    Tatsächlich habe ich noch eine zweite Frage:
    Nachdem das projekt erstellt wurde kann ich die erstellte .exe Datei aufrufen und die Datei conf.ini (liegt im gleichen Verzeichnis) wird eingelesen.
    Versuche ich aber das gleiche nachdem ich in der CodeBlocks-IDE 'Build & Run' klicke erscheint eine Fehlermeldung die besagt dass die Datei conf.ini nicht gefunden wurde.
    Woran könnte das liegen? Die zu lesende Datei liegt doch im gleichen Verzeichnis wie auch die erstellte .exe.

    Liegt daran, dass CodeBlocks ein anderes Arbeitsverzeichnis für die EXE setzt, wenn du es von der IDE aus ausführst (das hat den Sinn, dass verschiedene Builds (z.B. Debug und Release) das gleiche Arbeitsverzeichnis verwenden können). Kann man sicherlich irgendwo ändern.

    Gruß



  • Vielen Dank für die hilfreiche Antwort!
    Ich hab mich noch ein wenig tiefer in die Klassen wxMBConvUTF8 und wxTextFile eingelesen und glaube dabei (Quelle habe ich nicht mehr zur Hand) gelesen zu haben dass die Funktionen der Klasse wxTextFile je nach zu speicherndem Format (char, wchar_t, ...) automatisch die geeignete Kodierung verwenden.
    Das conf.ini file soll den Pfad zu einem logfile aufnehmen (sodass der user diesen nicht immer wieder angeben muss sollte das logfile nicht im Arbeitsverzeichnis liegen). In diesem Zusammenhang denke ich dass ich auch mit ANSI-Kodierung noch leben kann wenn meine Annahme, dass Pfade zu Dateien nur ASCII-Zeichen enthalten (dürfen), richtig ist. Stimmt das auch für, sagen wir mal, russische (windows) Betriebssysteme? Pfadangaben in kyrillischer Schrift? Naja...

    Wie schon gesagt soll das Programm das Logfile eines Servers auswerten, diese Logfiles sind mehrere MB groß (mehrere zehntausende Zeilen). Nun lese ich in der wxTextFile class reference:

    One word of warning: the class is not at all optimized for big files and thus it will load the file entirely into memory when opened. Of course, you should not work in this way with large files (as an estimation, anything over 1 Megabyte is surely too big for this class). On the other hand, it is not a serious limitation for small files like configuration files or program sources which are well handled by wxTextFile.

    Für das Auslesen und schreiben in die .ini ist wxTextFile also gut geeignet, nun wollte ich die gleichen Funktionen dieser Klasse (weil recht bequem) auch für das Auslesen der Logfiles verwenden... 😞
    Performance ist nicht unbedingt das wichtigste Ziel meiner Implementierung, ich möchte aber nicht unbedingt erleben dass das Auswerten derart vieler Zeilen (erstellen von substrings und vergleichen mit anderen Strings z.B.) am Ende Minuten dauert...
    Welche wxKlasse würde sich besser eignen? Ich möchte wegen des sehr umfangreichen unicode-supports (die logfiles enthalten z.B. auch kyrillische Zeichen) gerne wx-eigene Klassen verwenden. wxFile war meine erste Idee, diese Klasse stellt aber leider nicht die benötigten Funktionen (wie z.B. GetLine()) bereit.

    Lieben Gruß, Alberich


Log in to reply