1

Windows 7 で C++Builder XE5 (bcc32) を使用する。

ファイル名にワイド文字が含まれているファイルを開こうとしています。私がテストしている実際のファイル名はC:\bΛx\foo.txt. そこにある非ASCII文字は U+039B です。

このファイル名は . に正しく保存されていstd::wstringます。ただし、次のことを試みます。

std::ifstream f( filename.c_str() );

ファイルを開くことができません。

もちろん、標準 C++fopenではchar *. ただし、Dinkumware C++ RTL 実装には、 を受け入れるオーバーロードがありwchar_t *ます。残念ながら、そのオーバーロードの実装は を...\Embarcadero\RAD Studio\12.0\source\cpprtl\Source\dinkumware\source\fiopen.cpp呼び出しません_wfopen。代わりに、 を使用wcstombsして文字列を UTF-8 に変換してから を呼び出しますfopen

のソースをチェックすると、最終的に UTF-8 文字列を に渡すfopen基礎となる関数のナロー バージョンが呼び出されます。___topenCreateFile

Sysinternals Process Monitor を使用してファイルを開こうとする試みを調べると、UTF-8 ファイル文字列でファイルを開こうとしたことが示され、オペレーティング システムはこれを拒否し、結果はNAME COLLISION.

を使用してファイルを開くと、_wfopen( filename.c_str(), L"r" )すべて問題なく、CI/O 関数を使用してファイルを読み取ることができますが、もちろん C++ iostream は使用できません。

std::ifstreamファイル名に U+039B などの文字が含まれるファイルを開く方法はありますか?

std::wifstream usingも機能しないことに注意してください(ファイル名の UTF-8 バージョンを開こうとします)。

4

1 に答える 1

0

を使用してファイルを開くと、_wfopen( filename.c_str(), L"r" )すべて問題なく、CI/O 関数を使用してファイルを読み取ることができますが、もちろん C++ iostream は使用できません。

「当然」としか思えません。streambufあなたの問題は、からiostreams を作成することに軽減されFILE*ます。Howard Hinnant はここで、標準で提供されるメソッドはないと答えましstreambufたが、派生クラスを上に実装するのFILE*は非常に簡単です。彼は、良い出発点になると思われるいくつかのコードについても言及しています。

これは、テキスト ファイルに対してのみ意味があることに注意してください。iostream とバイナリ ファイルはうまくいきません。文字エンコーディング層がありios_base::binary、それをオフにしません。

于 2014-10-15T21:24:10.827 に答える