[gelöst] UNICODE in Datei schreiben



  • Hallo zusammen.

    Ich habe u.a. auch schon in diesem Forum nach Lösungen gesucht - und auch gefunden. Allerdings konnte ich nicht wirklich was damit angefangen.

    Und zwar möchte ich UNICODE in eine Datei schreiben. Allerdings funktioniert das nicht wirklich. Setze ich einen Break-Point an der Stelle, an der in die Datei geschrieben wird, läuft scheinbar alles durch. Auch die Daten die geschrieben werden sollen, sind OK. In der Datei steht aber nur eine Zeile - der Rest ist nicht da.

    Geschrieben habe ich

    typedef struct
    {
      wchar_t objNummer[15];
      wchar_t name[50];
      wchar_t pfade[4][200];
    }strctEintrag;
    
    wfstream listFile;
    strctEintrag objectMeta[100];
    
    //Strukturarray mit Daten füllen
    //...
    
    for(i=0; i < curStruct; i++)
      listFile.write((wchar_t*) &objectMeta[i], sizeof(strctEintrag));
    
    listFile.close();
    

    Jemand eine Ahnung

    Gruß
    Kai



  • Du schreibst nirgendwo Zeilen, warum sollten also welche drin sein?



  • Ich gehe davon aus, dass ich damit

    for(i=0; i < curStruct; i++)
      listFile.write((wchar_t*) &objectMeta[i], sizeof(strctEintrag));
    

    alle Daten reinschreibe. Wie ist es denn richtig?



  • Du schreibst curStruct mal sizeof(strctEintrag) Bytes. Da sind keine Zeilen. Wie es "richtig" ist hängt davon ab, was du eigentlich willst.



  • Ich will die Daten aus dem Struktur-Array in die Datei schreiben und diese später wieder in ein Struktur-Array auslesen.

    curStruct ist nur die Anzahl der Arrayelemente. Ich gehe gerade davon aus, dass ich mit dem ersten Parameter an write den Startpunkt angebe und mit dem zweiten sage ich halt wie viel er schreiben soll. strctEintrag ist ja der Datentyp, also verstehe ich das so, dass ich von Position objectMeta[i], sizeof(strctEintrag) Bytes schreibe.



  • Ja. Und weiter?



  • Ich habe diese Struktur. Von dieser Struktur habe ich ein Array mit 100 Elementen angelegt. Jedes dieser Element wird jetzt beschrieben. Danach will ich das gesamte Array in eine Datei schreiben (habe auch schon versucht das einfach nur das ganze Array anzugeben -> listFile.write((wchar_t*) &objectMeta, sizeof(objectMeta)); Hat aber auch nicht funktioniert.

    Meine Frage: Wie schreibe ich das gesamte, zuvor gefüllte Array, als UNICODE-Stream in eine Datei und wie schreibe ich diese Daten ebenso wieder in ein solches Array zurück?

    Als Nicht-UNICODE-Variante geht das ja, aber als UNICODE nicht.



  • _Bongo schrieb:

    Hat aber auch nicht funktioniert.

    Aha. Weil keine Zeilen da sind. Dass es keine geben kann hatten wir aber schon geklärt.



  • Nimm std::fstream, bzw. std::ofstream.

    Ich vermute, dass das Problem darin liegt, dass sizeof(wchar_t) != 1 ist.

    Wenn Du sizeof(mystruct) machst, bekommst Du die Anzahl der Bytes, die die Struct belegt. Schreibst Du auf ein wstream mit write, erwartet write die anzahl der wchar_t-Zeichen, die aber nicht der Anzahl der Bytes in der struct entsprechen.

    Das könnte gehen:

    listFile.write(reinterpret_cast<wchar_t*>(&objectMeta[i]), sizeof(strctEintrag)/sizeof(wchar_t));
    

    Dass ich den Cast geändert habe, liegt einfach daran, dass ich es nicht übers Herz bringe, diesen C-Style-Cast zu veröffentlichen. Das reinterpret_cast macht es deutlicher, wie kaputt das eigentlich ist.



  • Aber das Array ist voll beschrieben und in der Nicht-UNICODE-Varianten schreibt das Programm alles in die Datei und holt es auch wieder raus. Stelle ich fstream dann aber auf wfstream um, geht es nicht mehr. Das dürfte aber doch mit einem fstream-Objekt ebenso wenig klappen, wenn keine Zeilen da sind. Warum sind in der einfachen Varianten Zeilen vorhanden und in der UNICODE-Varianten plötzlich nicht mehr?



  • Das mit dem /sizeof(wchar_t) will auch nicht funktionieren.



  • wchar_t hat mit UNICODE nur indirekt zu tun!
    Schau dir die erzeugte Datei mal mit einem Hexeditor an, dann verstehst du vllt. wie ein wchar_t aufgebaut ist (Stichwort: UCS, s.a. Wide character)...

    Edit: ich nehme mal an, daß du UTF-8 Dateien erzeugen willst (welche dann auch mit einem Texteditor lesbar sind) - dafür benötigst du dann aber eine UTF-8 Implementierung (unter Windows einfach WideCharToMultiByte).



  • Auszug aus winnt.h
    typedef wchar_t WCHAR; // wc, 16-bit UNICODE character

    Was stimmt nicht an dieser Zeile, wenn wchar_t nix mit UNICODE zu tun hat? Es ist die Darstellung von Zeichen mittels 2 Bytes.



  • Was genau verstehst du denn unter Zeilen (denn bisher schreibst du ja die ganzen Strukturdaten binär dort rein, inklusive Nullterminierung etc.)?

    PS: Habe gerade meinen oberen Beitrag noch editiert.



  • Von Zeilen hat manni66 gesprochen.

    Ich arbeite die ganze Zeit mit UNICODE-Werten und will einfach nur diese Daten in jede Struktur meines Struktur-Arrays schreiben (was ja auch funzt), und diese dann anschließend in eine Datei speichern.
    Anschließend wieder aus der Datei in ein solches Array von eben solchen Strukturen zurückschreiben.

    Die sollen nicht im Texteditor lesbar sein. Ich will diese Daten aus der Datei in das Struktur-Array schreiben, und Teile dieser Daten aus jeder Struktur in ein ListBox-Steuerelement eintragen.



  • Du hast gleich im ersten Beitrag geschrieben:

    _Bongo schrieb:

    In der Datei steht aber nur eine Zeile - der Rest ist nicht da.

    Wie hast du denn überprüft, ob dort mehr drin steht?



  • Ich ging von einer Zeile aus, weil ich scheinbar alle Strukturen in die Datei geschrieben hatte, aber beim Öffnen der Datei nur eine einzige Zeile sah. Ich hatte das testweise in eine TXT-Datei geschrieben, aber nur, weil ich das in Binärdateien so schlecht ermitteln konnte.



  • _Bongo schrieb:

    Was stimmt nicht an dieser Zeile, wenn wchar_t nix mit UNICODE zu tun hat? Es ist die Darstellung von Zeichen mittels 2 Bytes.

    Hast du das hier schon gelesen?
    http://www.joelonsoftware.com/articles/Unicode.html



  • Kann ich mir bei Zeiten mal durchlesen, aber ist mit Sicherheit nicht so kompliziert, nicht so umständlich, die funktionierende Variante mit fstream durch die wfstream-Variante zu ersetzen - oder?



  • _Bongo schrieb:

    Von Zeilen hat manni66 gesprochen.

    Nein, du in deinem ersten Post.

    _Bongo schrieb:

    In der Datei steht aber nur eine Zeile - der Rest ist nicht da.


Log in to reply