2009-05-23 12 views
7

私は簡単な質問をします。私はFFFEで始まると読むためのUTF 16テキストファイルを持っています。この種のファイルを処理するC++ツールとは何ですか?私はちょうどそれを読んで、いくつかの行をフィルタリングし、結果を表示したいと思う。ユニコードファイルを読むC++

シンプルに見えますが、単純なアスキーファイルでの作業には経験があり、私は急いでいます。私はVS C++を使用していますが、マネージC++で作業したくありません。

よろしくここ

プット非常に簡単な例

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(); 

答えて

2

あなたは16ビット文字を読み取っfgetwsを、使用することができます。あなたのファイルはバイトエンディアンのリトルエンディアンです。 x86マシンもリトルエンディアンなので、ファイルをあまり問題なく扱うことができるはずです。出力を行う場合は、fwprintfを使用します。

また、より多くの情報が役立つと私は同意します。たとえば、これを抽象化したライブラリを使用している可能性があります。

+0

はい、あなたはすべて、より多くの情報が役に立つかもしれないと言いました。私はmsdn、Jeffrey Richterの本で試しましたが、このテーマについて話すときには良い例はないようです。おかげで – Andres

0

FFFEはちょうど最初のBOM(バイトオーダーマーク)です。通常と同じようにファイルから読み込みますが、ワイド文字バッファに読み込みます。

+0

のコード例では、常に良いアイデアです - どのように彼は、通常、ファイルを読み込む方法を知っていますか? –

+0

私はNeilに同意しますが、Andresはこう言っています。「ただ、単純なascciファイルでの作業には経験があります。 ;) – xian

1

あなたは急いでいるので、バイナリモードでifstreamを使って仕事をしてください。私はあなたと同じ問題を抱えていました。 (それは当然の推奨される解決策、そのわずかハックではありません)

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

ニックこの答えは本当に私を助けました。 fgetwsにはサイズのバッファが必要です。 –