Использование C++Builder XE5 (bcc32) в Windows 7.
Я пытаюсь открыть файл, имя которого содержит широкий символ. Фактическое имя файла, с которым я тестирую, — 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
.
Проверяя источник на наличие fopen
, он вызывает узкую версию базовой функции ___topen
, которая в конечном итоге передает строку UTF-8 в CreateFile
.
Когда я проверяю попытку открыть файл с помощью Sysinternals Process Monitor, он показывает, что он пытался открыть файл со строкой файла UTF-8, и операционная система отклонила это с результатом NAME COLLISION
.
Если я открою файл с помощью _wfopen( filename.c_str(), L"r" )
, тогда все будет хорошо, и я смогу прочитать файл с помощью функций ввода-вывода C, но, конечно, я не могу использовать C++ iostreams.
Есть ли способ использовать std::ifstream
для открытия файла с U+039B или другими подобными символами в имени файла?
Обратите внимание, что использование std::wifstream
также не работает (он по-прежнему пытается открыть версию имени файла UTF-8).
wchar_t*
версияifstream
, иwifstream
должны использовать исходное значение как есть с_wfopen()
, без преобразования в UTF-8 и вызоваfopen()
. Это может работать на других платформах, но не на Windows. - person Remy Lebeau   schedule 16.10.2014#ifdef
, который заставит все вызовы проходить через_wfopen
, но (насколько я мог видеть при беглом взгляде) он не может заставитьfstream(char *)
перейти кfopen
, а такжеfstream(wchar_t *)
перейти к_wfopen
в той же сборке. . Я не уверен, поддерживает ли C++Builder попытки пересобрать упакованную версию Dinkum для настройки_wfopen
? - person M.M   schedule 16.10.2014