Wie öffnen Sie eine Datei mithilfe eines Dateisystem-Pfads plattformübergreifend?

Angenommen, Sie haben das neue @ verwendestd::filesystem (oderstd::experimental::filesystem) Code zum Auffinden einer Datei. Du hast einpath Variable, die den vollständigen Pfadnamen zu dieser Variablen enthält.

Wie öffnest du diese Datei?

Das mag albern klingen, aber bedenken Sie die offensichtliche Antwort:

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

Das ist nichtgarantier arbeiten. Warum? Denn unter Windows zum Beispiel,path::string_type iststd::wstring. Sopath::c_str gibt ein @ zurüconst wchar_t*. Undstd::ifstream könnennu nimm Pfade mit einemconst char* Art

Nun stellt sich heraus, dass dieser Code tatsächlich in VS funktioniert. Warum? Weil Visual Studio ein @ h Bibliothekserweiterung, mit der dies funktioniert. Aber das ist kein Standardverhalten und daher nichttragba. Ich habe beispielsweise keine Ahnung, ob GCC unter Windows dieselbe Funktion bietet.

Sie könnten dies versuchen:

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

Nur Windows verwirrt uns wieder. Weil wennmy_path enthielt zufällig Unicode-Zeichen. Jetzt müssen Sie das Windows ANSI-Gebietsschema richtig einstellen. Und selbst das wird Sie nicht unbedingt retten, wenn der Pfad Zeichen aus mehreren Sprachen enthält, die nicht in demselben ANSI-Gebietsschema existieren können.

Boost Filesystem hatte tatsächlich ein ähnliches Problem. Aber sie haben ihre Version von iostreams erweitert, um @ zu unterstützepaths direkt.

ermisse ich hier etwas? Hat der Ausschuss eine plattformübergreifende Dateisystembibliothek hinzugefügt, ohne @ eine plattformübergreifende Methode hinzuzufügeöffne Dateien drin?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage