Используя файловую систему :: путь, как вы открываете файл кросс-платформенным способом?
Допустим, вы использовали новый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
напрямую.
Я что-то здесь упускаю? Добавил ли комитет кроссплатформенную библиотеку файловой системы, не добавив кроссплатформенный способоткрыть файлы в нем?