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 バージョンを開こうとします)。