Usando un sistema de archivos :: ruta, ¿cómo se abre un archivo en una plataforma cruzada?

Digamos que has usado el nuevostd::filesystem (ostd::experimental::filesystem) para buscar un archivo. Usted tiene unpath variable que contiene el nombre de ruta completo a esta variable.

¿Cómo abres ese archivo?

Eso puede sonar tonto, pero considere la respuesta obvia:

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

Esto no esgarantizado trabajar. ¿Por qué? Porque en Windows, por ejemplo,path::string_type esstd::wstring. Entoncespath::c_str devolverá unconst wchar_t*. Ystd::ifstream puedesolamente tomar caminos con unconst char* tipo.

Ahora resulta que este código realmente funcionará en VS. ¿Por qué? Porque Visual Studio tiene unextensión de biblioteca que permite que esto funcione. Pero ese es un comportamiento no estándar y, por lo tanto, noportátil. Por ejemplo, no tengo idea si GCC en Windows proporciona la misma función.

Podrías probar esto:

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

Solo Windows nos confunde nuevamente. Porque simy_path pasó a contener caracteres Unicode, entonces ahora depende de configurar correctamente las cosas de la configuración regional de Windows ANSI. E incluso eso no necesariamente lo salvará si la ruta tiene caracteres de varios idiomas que no pueden existir en el mismo entorno ANSI.

Boost Filesystem en realidad tenía un problema similar. Pero ampliaron su versión de iostreams para soportarpaths directamente.

¿Me estoy perdiendo de algo? ¿El comité agregó una biblioteca de sistema de archivos multiplataforma sin agregar una forma multiplataforma paraabierto archivos en el?

Respuestas a la pregunta(1)

Su respuesta a la pregunta