2011-03-05 1 views
1

私は単純な単純な単純なユニコードファイルをint変数に数えて読み込みたいと思っていますが、何時間も検索しても、仕事!Visual C++でシンプルなユニコードのテキストファイルを読み込んでパースする

私のファイルのようになります。

1337 42 23 

それはユニコードなので、それはまた、冒頭では0xFF 0xFEのBOMマークが付いています。

私はwifstreamとfwscanf()を試しましたが、どちらもBOMに固執し、BOMをスキップしても両方の関数は "1"しか読みません(0x00文字で混乱してしまいます。ユニコードを理解する)。

私の質問は、どのようにユニコードのVisual C++アプリケーションで単純なユニコードファイルを読み、解析するのですか?

はここ(バージョンfwscanf)私のソースです:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int x; 
    FILE * f = _wfopen(L"bla.txt", L"r+"); 
    if (!f) return -1; 

    fseek(f, 2, SEEK_SET); // skip the BOM mark 

    fwscanf(f, L"%d", &x); 
    wprintf(L"Number read: %d\n", x); 

    fclose(f); 
    return 0; 
} 

、出力は次のとおりです。

Number read: 1 

答えて

2

マイクロソフトCRTはVS2005ので、BOMの自動検出をサポートしています。これを有効にするには、mode引数の "ccs"属性を使用します。このように:

FILE * f = _wfopen(L"c:\\temp\\test.txt", L"rt, ccs=UNICODE"); 

ファイルにBOMがない場合は、ANSIに戻されます。あなたはそのような問題の人に "UTF-8"または "UTF-16LE"を使うことができます。これはもちろん非標準的です。

+0

ありがとうございます!マットのソリューションも機能しますが、これは少しクリーンです。なぜユニコードがユニコードのアプリで好まれるエンコーディングではないのだろうか。それでは、Visual Studioの最初のことは意味をなさないことではありません。 – blade

+1

それはあまりにも多くのレガシーコードを壊すでしょう。 –

関連する問題