Почему итератор пути возвращает "\\" при обходе? - PullRequest
12 голосов
/ 05 июля 2019

Я использую новый современный C ++ 17 с API файловой системы.Я работаю в Windows с Visual Studio 2017.

Следующий код дает неожиданный результат:

#include <iostream>
#include <filesystem>

int main()
{
  std::filesystem::path path(R"(D:\dir\file.cpp)");
  for (auto& dir : path)
  {
    std::cout<<dir<<std::endl;
  }
}

Результат:

"D:"
"\\"
"dir"
"file.cpp"

Почему было "\\ "print?

При проверке этого в GCC 9.1.0 (пожалуйста, измените '\' на '/' в переменной пути), результат:

"D:"
"dir"
"file.cpp"

Почему такое поведениеотличается?

Какой результат является правильным в соответствии со стандартом C ++ 17?

1 Ответ

9 голосов
/ 05 июля 2019

См. https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#fully-qualified-vs-relative-paths для получения некоторой информации об именах путей Windows.

Стандарт C ++ говорит об итераторах пути ( [fs.path.itr] / 4 ):

Для элементов пути в общем формате порядок прямого обхода следующий:

  • Элемент root-name , если имеется.
  • Элемент root-directory , если имеется. [Примечание: универсальный формат необходим для правильной работы лексикографического сравнения. - конец примечания]
  • Каждый последующий элемент filename , если имеется.
  • Пустой элемент, если присутствует конечный некорневой разделитель каталогов .

В Windows путь D:\dir\file.cpp имеет обозначение диска D:, за которым следует корневой каталог на этом диске \, затем путь dir, file.cpp. В соответствии с Windows, D: является корневым именем, поэтому \ является корневым каталогом. Вы можете иметь D:dir\file.cpp, но обратите внимание, что теперь это относительный путь.

В gcc, если не в windows, D: будет обрабатываться как обычное имя каталога (так же, как ./D:/dir/file.cpp). Таким образом, нет корневого имени или корневого каталога. Если бы вместо этого у вас было /D:/dir/file.cpp, итератор содержал бы /, D:, dir, file.cpp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...