Probleme beim Einlesen von Unicode-Datei und sichern in wchar_t-Typ



  • Hallo!

    Ich arbeite an einem Program, dass Unicode-Dateien einlesen soll. Die einzelnen Zeichen sollen in einem wchar_t gespeichert werden. Ich benutze dazu einen wifstream. Um ein Zeichen aus der Datei zu lesen benutze ich .get() und hier liegt mein Problem. Denn das get() liefert nur ein Byte und nicht, wie es ein wchar_t erwartet 2 Byte. Das heisst, ich bekomme für ein gelesenes "A" zwei Werte. Einmal den korrekten Wert 65 und einmal eine 0. Das würde ich aber gerne vermeiden und nur die 65 erhalten. Hier kommt meine Frage:
    Gibt es eine Funktion, mit der ich direkt einen wchar_t aus einer Datei lesen kann oder gibt es Funktionen, die die Konvertierung übernehmen könnten?

    Ich hätte schon selbst eine Idee, indem ich die beiden Werte einfach addiere, aber das ist irgendwie unschön.

    Schon einmal Danke im Voraus für alle Antworten !!!



  • read methode



  • Das ist ja nicht gerade eine ausgeprägte Antwort.
    Wie meinst du das mit der read Methode?

    Ein Zusatz noch: Das Programm soll ausschliesslich in c++ geschrieben werden.



  • Aus der MSDN:

    basic_istream::get
    int_type get();
    basic_istream& get(E& c);
    basic_istream& get(E *s, streamsize n);
    basic_istream& get(E *s, streamsize n, E delim);
    basic_istream& get(basic_streambuf<E, T> *sb);
    basic_istream& get(basic_streambuf<E, T> *sb, E delim);
    The first of these unformatted input functions extracts an element, if possible, as if by returning rdbuf()->sbumpc(). Otherwise, it returns T::eof(). If the function extracts no element, it calls setstate(failbit).

    The second function extracts the int_type element x the same way. If x compares equal to T::eof(x), the function calls setstate(failbit). Otherwise, it stores T::to_char_type(x) in c. The function returns *this.

    The third function returns get(s, n, widen('\n')).

    The fourth function extracts up to n - 1 elements and stores them in the array beginning at s. It always stores E(0) after any extracted elements it stores. Extraction stops early on end-of-file or on an element that compares equal to delim (which is not extracted). If the function extracts no elements, it calls setstate(failbit). In any case, it returns *this.

    The fifth function returns get(sb, widen('\n')).

    The sixth function extracts elements and inserts them into sb. Extraction stops on end-of-file or on an element that compares equal to delim (which is not extracted). It also stops, without extracting the element in question, if an insertion fails or throws an exception (which is caught but not rethrown). If the function extracts no elements, it calls setstate(failbit). In any case, the function returns *this.

    und da:
    typedef basic_ifstream<wchar_t, char_traits<wchar_t> > wifstream;

    ALso ich wuerd fast vermuten, das der int_type, den get() zurueckliefert, nicht nur 1 byte ist ....

    Ciao ...



  • probie mal so,

    wchat_t c;
    der_stream.get(c);
    

    das ist eine der überladung für get



  • So mache ich es ja schon, aber es werden trotzdem zwei Werte geliefert. Vielleicht binde ich ja die falschen Headerfiles ein. Bei mir sind es:

    #include <iostream>
    #include <fstream>
    #include <wchar.h>
    

    Was mich ausserdem wundert ist, das die automatische Anzeige der zur Verfügung stehenden Klassenelemente nur bei ifstream angezeigt wird. Sobald ich den wifstream benutze, der ja auch gebraucht wird soweit ich das verstanden habe, bekomme ich nicht zu sehen, welche Methoden darauf anwendbar sind. Vielleicht hat ja jemand eine Idee woran das liegen könnte.



  • Was mich ausserdem wundert ist, das die automatische Anzeige der zur Verfügung stehenden Klassenelemente nur bei ifstream angezeigt wird.

    Intellisence ist doof ... zumindest bei VC++;
    bei typedefs steigt sie bei mir grundsaetzlich aus ! Weiss ned ob andere IDE's da besser sind ...

    aber es werden trotzdem zwei Werte geliefert

    Wie 2 Werte ??? DU musst 2mal get() aufrufen, um einen Buchstaben weiter zu kommen ?

    Ciao ...



  • Das mit dem nicht angezeigten Methoden kann ich erklären:

    Das liegt an der Browserinformation, die VisualC immer wieder erstellt.

    Mache mal folgendes:

    Gehe in Project->Setting->C/C++ dort müsstest Du ein Kästchen mit "Generate Browse Info" finden, das sollte aktiviert sein.

    Schließe VC.

    Gehe in das Workspace-Verzeichniss und lösche alle Dateien, die mit
    .opt
    .ncb
    .plg
    enden.

    Außerdem lösche das komplette Debug Verzeichnis!

    Keine Angst, das sind nur Infos die von VC generiert werden, und wenn sie fehlen werden sie neu erstellt.

    Jetzt öffne VC und den Worcspace wieder, und compiliere dein Prg. neu!

    Dann sollten alle Methoden VC bekannt sein, und werden auch dann angezeigt...

    Viel Spaß weiterhin



  • @RHBaum:
    Ja genau! In der while-Schleife wird 2mal get() aufgerufen.
    Hier der Code:

    wifstream datei(dateiname);		//zu öffnende Unicode-Datei		
    		if(!datei.good()) { 
    			return false;				//Wenn nicht geöffnet werden kann -> Fehler
    		}
    		else {				//sonst Bearbeitung, solange bis Dateiende nicht erreicht
    			uint32 i=0, j=0;
    			wchar_t wc;
    			myUnicodeElement.setTextPosition( i );	//Textposition = 0
    			while( datei.get(wc) ) {
    				j++;
    				//if( (wc < 256) && (wc == 0) ) {					
    					myUnicodeElement.setZeichen( wc );
    					myUnicodeElement.setTextPosition( i );
    					inhalt.push_back(myUnicodeElement);
    					i++;
    				//}
    				//else {
    					//myUnicodeElement.setZeichen(wc[0]+
    				//}
    			}
    			cout << "j=" << j << endl;
    			return true;
    		}
    

    Als Ergebnis für die Sequenz "A B C" bekomme ich dann halt folgendes:
    65 0
    32 0
    66 0
    32 0
    67 0

    @norman_timo:
    Danke für den Tip, aber das hat leider auch nicht geklappt. Ist aber auch nicht so wild. Wäre zwar nett, aber nicht lebenswichtig!


Anmelden zum Antworten