Используя файловую систему :: путь, как вы открываете файл кросс-платформенным способом?

Допустим, вы использовали новыйstd::filesystem (или жеstd::experimental::filesystem) код для поиска файла. У тебя естьpath переменная, которая содержит полный путь к этой переменной.

Как вы открываете этот файл?

Это может звучать глупо, но рассмотрим очевидный ответ:

std::filesystem::path my_path = ...;
std::ifstream stream(my_path.c_str(), std::ios::binary);

Это негарантированный работать. Зачем? Потому что в Windows, например,path::string_type являетсяstd::wstring, Такpath::c_str вернетconst wchar_t*, А такжеstd::ifstream Можнотолько идти по пути сconst char* тип.

Теперь выясняется, что этот код действительно будет работать в VS. Зачем? Потому что Visual Studio имеетрасширение библиотеки, которое позволяет это работать, Но это нестандартное поведение и поэтому непортативный, Например, я понятия не имею, обеспечивает ли GCC в Windows ту же функцию.

Вы можете попробовать это:

std::filesystem::path my_path = ...;
std::ifstream stream(my_path.string().c_str(), std::ios::binary);

Только Windows снова смущает нас. Потому что, еслиmy_path Если в нем содержатся символы Юникода, то теперь вы зависите от правильной настройки локали Windows ANSI. И даже это не обязательно спасет вас, если в пути есть символы из нескольких языков, которые не могут существовать в одной и той же локали ANSI.

У Boost Filesystem фактически была похожая проблема. Но они расширили свою версию iostreams для поддержкиpathнапрямую.

Я что-то здесь упускаю? Добавил ли комитет кроссплатформенную библиотеку файловой системы, не добавив кроссплатформенный способоткрыть файлы в нем?

Ответы на вопрос(1)

Ваш ответ на вопрос