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 suportarpaths 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?

questionAnswers(1)

yourAnswerToTheQuestion