Usando um sistema de arquivos :: path, como você abre um arquivo de maneira multiplataforma?
Digamos que você tenha usado o novostd::filesystem
(oustd::experimental::filesystem
) para procurar um arquivo. Você tem umpath
variável que contém o nome completo do caminho para essa variável.
Como você abre esse arquivo?
Isso pode parecer bobagem, mas considere a resposta óbvia:
std::filesystem::path my_path = ...;
std::ifstream stream(my_path.c_str(), std::ios::binary);
Isso não égarantido trabalhar. Por quê? Porque no Windows, por exemplo,path::string_type
éstd::wstring
. assimpath::c_str
retornará umconst wchar_t*
. Estd::ifstream
podesó percorrer caminhos com umconst char*
tipo.
Agora acontece que esse código realmente funcionará no VS. Por quê? Como o Visual Studio tem umextensão de biblioteca que permite que isso funcione. Mas esse é um comportamento não padrão e, portanto, nãoportátil. Por exemplo, não faço ideia se o GCC no Windows oferece o mesmo recurso.
Você pode tentar o seguinte:
std::filesystem::path my_path = ...;
std::ifstream stream(my_path.string().c_str(), std::ios::binary);
Somente o Windows nos confunde novamente. Porque semy_path
passou a conter caracteres Unicode, agora você depende da configuração correta do material de localidade do Windows ANSI. E mesmo isso não salvará você necessariamente se o caminho tiver caracteres de vários idiomas que não podem existir no mesmo local ANSI.
O sistema de arquivos Boost realmente teve um problema semelhante. Mas eles estenderam sua versão do iostreams para suportarpath
s diretamente.
Estou faltando alguma coisa aqui? O comitê adicionou uma biblioteca de sistema de arquivos de plataforma cruzada sem adicionar uma maneira de plataformaabrir arquivos nele?