[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


Anmelden zum Antworten