Допустим, вы использовали новый код 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);
Только винда нас опять смущает. Потому что, если my_path
содержит символы Unicode, то теперь вы зависите от правильной настройки локали Windows ANSI. И даже это не обязательно спасет вас, если путь содержит символы из нескольких языков, которые не могут существовать в одной и той же локали ANSI.
У Boost Filesystem действительно была похожая проблема. Но они расширили свою версию iostreams, чтобы напрямую поддерживать path
s.
Я что-то упустил здесь? Добавил ли комитет кроссплатформенную библиотеку файловой системы, не добавляя в нее кроссплатформенный способ открывать файлы?
basic_ifstream<path::value_type> stream(my_path);
, или я что-то упустил? Это конечно не красиво... - person chris   schedule 30.06.2016basic_ifstream
относится к типу символа данных, которые он читает/записывает, а не к пути, по которому он идет. - person Nicol Bolas   schedule 30.06.2016