2009-05-23 14 views
7

Ich habe eine einfache Frage zu stellen. Ich habe eine UTF 16 Textdatei zu lesen, die mit FFFE beginnt. Was sind die C++ - Tools, um mit dieser Art von Datei umzugehen? Ich möchte es nur lesen, einige Zeilen filtern und das Ergebnis anzeigen.Unicode-Dateien lesen C++

Es sieht einfach aus, aber ich habe nur Erfahrung in der Arbeit mit einfachen Ascci-Dateien und ich bin in Eile. Ich benutze VS C++, aber ich möchte nicht mit verwaltetem C++ arbeiten.

Grüße

hier ein Setzen Sie ein sehr einfaches Beispiel

wifstream file; 
file.open("C:\\appLog.txt", ios::in); 

wchar_t buffer[2048]; 
file.seekg(2); 
file.getline(buffer, bSize-1); 

wprintf(L"%s\n", buffer); 
file.close(); 

Antwort

2

können Sie fgetws verwenden, die 16-Bit-Zeichen liest. Ihre Datei befindet sich in Little-Endian-Byte-Reihenfolge. Da x86-Maschinen auch Little-Endian sind, sollten Sie in der Lage sein, die Datei ohne große Probleme zu handhaben. Wenn Sie eine Ausgabe vornehmen möchten, verwenden Sie fwprintf.

Auch stimme ich zu, weitere Informationen könnten nützlich sein. Zum Beispiel verwenden Sie möglicherweise eine Bibliothek, die etwas davon abstrahiert.

+0

Ja, Sie sagten alle, mehr Informationen könnten nützlich sein. Ich habe versucht, MSDN, Jeffrey Richter Buch, aber es scheint, sie haben keine guten Beispiele, wenn Sie über dieses Thema sprechen. Danke – Andres

0

Die FFFE ist nur der erste BOM (Bytereihenfolgemarkierung). Lesen Sie einfach wie gewohnt von der Datei, aber in einen breiten Zeichenpuffer.

+0

Beispielcode ist immer eine gute Idee (es ist nicht eine empfohlene Lösung, natürlich, es ist nur ein Hack ist) - wie Sie wissen, wie er normalerweise eine Datei liest? –

+0

Während ich mit dir Neil zustimme, sagt Andres: "Aber ich habe nur Erfahrung in der Arbeit mit einfachen Ascci-Dateien." ;) – xian

1

Da Sie es eilig haben, verwenden Sie ifstream im Binärmodus und machen Sie Ihre Arbeit. Ich hatte die gleichen Probleme mit dir und das rettete meinen Tag.

ifstream file; 
    file.open("k:/test.txt", ifstream::in|ifstream::binary); 

    wchar_t buffer[2048]; 
    file.seekg(2); 
    file.read((char*)buffer, line_length); 
    wprintf(L"%s\n", buffer); 
    file.close(); 
+0

Nick diese Antwort hat mir wirklich geholfen. fgetws benötigt einen großen Puffer. –