Использование ifstream, когда имя файла содержит широкие символы

Использование 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, но, конечно, я не могу использовать iostreams C ++.

Есть ли способ использовать std::ifstream открыть файл с U + 039B или другими такими символами в имени файла?

Обратите внимание, что с помощью std::wifstream тоже не работает (он все еще пытается открыть UTF-8 версию имени файла).

1

Решение

Если я открою файл с помощью _wfopen( filename.c_str(), L"r" ) тогда все хорошо, и я могу прочитать файл, используя функции ввода-вывода C, но, конечно, я не могу использовать iostreams C ++.

Я не вижу этого «конечно». Ваша проблема сводится к созданию iostreams streambuf из FILE*, Говард Хиннант ответил Вот что нет никакого стандарта, предусмотренного стандартом, но реализация streambufкласс на вершине FILE* это довольно просто. Он даже упоминает некоторый код, который, по его мнению, будет хорошей отправной точкой.

Обратите внимание, что это имеет смысл только для текстового файла. iostreams и бинарные файлы не уживаются; есть слой кодировки символов и ios_base::binary не выключает это.

0

Другие решения


По вопросам рекламы [email protected]