[gelöst] UNICODE in Datei schreiben
-
_Bongo schrieb:
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?
Vermutlich nicht, ich kenne die entsprechenden APIs nicht.
Aber: Du willst nicht "UNICODE" schreiben, sondern Text in einem bestimmten Character Encoding. Das könnte UTF-16 bzw. UCS-2 sein, oder UTF-8, oder sonstwas. Deine winnt.h-Referenz legt nahe, dass du UTF-16 meinen könntest (habe nicht viel Ahnung von Windows), aber du solltest vmtl. nochmal nachlesen, was genau du möchtest.
-
Das hier (was funktioniert):
struct _eintrag { long nummer; wchar_t name[30]; wchar_t testarray[4][150]; }eintrag[2]; int main() { fstream ausgabedatei; bool schalter=false; if(schalter) { ausgabedatei.open("U:\\structTest.dat", ios::out | ios::binary); eintrag[0].nummer=5146000; wcscpy_s(eintrag[0].name, L"Tabelle 1"); wcscpy_s(eintrag[0].testarray[0], L"Pfadangabe zu Version 602 (1)"); wcscpy_s(eintrag[0].testarray[1], L"Pfadangabe zu Version 700 (1)"); wcscpy_s(eintrag[0].testarray[2], L"Pfadangabe zu Version 710 (1)"); wcscpy_s(eintrag[0].testarray[3], L"Pfadangabe zu Version 800 (1)"); eintrag[1].nummer=5146001; wcscpy_s(eintrag[1].name, L"Tabelle 2"); wcscpy_s(eintrag[1].testarray[0], L"Pfadangabe zu Version 602 (2)"); wcscpy_s(eintrag[1].testarray[1], L"Pfadangabe zu Version 700 (2)"); wcscpy_s(eintrag[1].testarray[2], L"Pfadangabe zu Version 710 (2)"); wcscpy_s(eintrag[1].testarray[3], L"Pfadangabe zu Version 800 (2)"); for(int i=0; i < 2; i++) ausgabedatei.write((char*) &eintrag[i], sizeof(eintrag[0])); } else { ausgabedatei.open("U:\\structTest.dat", ios::in); ausgabedatei.read((char*) &eintrag, sizeof(eintrag[0])); for(int i=0; i < 2; i++) { cout << "Nummer: " << eintrag[i].nummer << endl; wcout << "Name: " << eintrag[i].name << endl; cout << "Pfade: " << endl; for(int j=0; j < 4; j++) wcout << eintrag[i].testarray[j] << endl; cout << endl; } } ausgabedatei.close(); cin.get(); return 0; }
soll so geschrieben werden (wfstream statt fstream):
#include <iostream> #include <fstream> using namespace std; struct _eintrag { long nummer; wchar_t name[30]; wchar_t testarray[4][150]; }eintrag[2]; int main() { wfstream ausgabedatei; bool schalter=false; if(schalter) { ausgabedatei.open("U:\\structTest.dat", ios::out | ios::binary); eintrag[0].nummer=5146000; wcscpy_s(eintrag[0].name, L"Tabelle 1"); wcscpy_s(eintrag[0].testarray[0], L"Pfadangabe zu Version 602 (1)"); wcscpy_s(eintrag[0].testarray[1], L"Pfadangabe zu Version 700 (1)"); wcscpy_s(eintrag[0].testarray[2], L"Pfadangabe zu Version 710 (1)"); wcscpy_s(eintrag[0].testarray[3], L"Pfadangabe zu Version 800 (1)"); eintrag[1].nummer=5146001; wcscpy_s(eintrag[1].name, L"Tabelle 2"); wcscpy_s(eintrag[1].testarray[0], L"Pfadangabe zu Version 602 (2)"); wcscpy_s(eintrag[1].testarray[1], L"Pfadangabe zu Version 700 (2)"); wcscpy_s(eintrag[1].testarray[2], L"Pfadangabe zu Version 710 (2)"); wcscpy_s(eintrag[1].testarray[3], L"Pfadangabe zu Version 800 (2)"); for(int i=0; i < 2; i++) ausgabedatei.write(reinterpret_cast<wchar_t*>(&eintrag[i]), sizeof(eintrag[0])); } else { ausgabedatei.open("U:\\structTest.dat", ios::in); ausgabedatei.read(reinterpret_cast<wchar_t*>(&eintrag[0]), sizeof(eintrag[0])); for(int i=0; i < 2; i++) { cout << "Nummer: " << eintrag[i].nummer << endl; wcout << "Name: " << eintrag[i].name << endl; cout << "Pfade: " << endl; for(int j=0; j < 4; j++) wcout << eintrag[i].testarray[j] << endl; cout << endl; } } ausgabedatei.close(); cin.get(); return 0; }
-
Die Frage ist, warum willst Du das mit wfstream machen? Du schreibst doch keine Textdatei mit UCS-2 Daten, sondern eine Binärdatei mit Datenblöcken. Dafür ist fstream sogar besser, da hier die Zeichengröße 1 ist und du damit direkt sizeof verwenden kannst.
Wenn Du das mit wfstream machst, so es denn funktioniert, würde die Datei exakt den gleichen Inhalt haben.
-
Ich habe sämtliche Zeilen in widechar vorliegen (Pfadangaben, Daten, ...). Von daher dachte ich, sei es sauberer, wenn ich die widechar-Daten via widechar-Filestream in eine Datei schiebe.
Aber wenn das mit fstream ja sogar besser ist, dann belasse ich das beim fstream - funktioniert ja schließlich.
Ich danke euch allen
Gruß
Kai