簡體   English   中英

為什么路徑的迭代器在遍歷時會返回“\\\\”?

[英]Why does path's iterator return “\\” while traversing?

我正在使用帶有文件系統API的新的現代C ++ 17。 我在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"

為什么打印“\\\\”?

在GCC 9.1.0中進行測試(請在路徑變量中將'\\'更改為'/'),結果為:

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

為什么行為不同?

根據C ++ 17標准,哪個結果是正確的?

有關Windows路徑名的一些信息,請參閱https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#fully-qualified-vs-relative-paths

關於路徑迭代器( [fs.path.itr] / 4 ),C ++標准有這個說法:

對於通用格式中路徑名的元素,正向遍歷順序如下:

  • 根名稱元素(如果存在)。
  • 根目錄元素(如果存在)。 [注意:通用格式是確保詞典比較正常工作所必需的。 - 結束說明]
  • 每個連續的文件名元素,如果存在。
  • 如果存在尾隨的非根目錄分隔符 ,則為空元素。

在Windows上,路徑D:\\dir\\file.cpp有一個D:的磁盤指示符,后跟該磁盤上的根目錄, \\ ,然后是dirfile.cpp的路徑。 根據Windows, D:是根名稱,因此\\是根目錄。 你可以有D:dir\\file.cpp ,但請注意,這是一個相對路徑。

在gcc上,如果沒有在Windows上, D:將被視為常規目錄名(與./D:/dir/file.cpp相同)。 因此,沒有根名稱或根目錄。 如果你已經不是了/D:/dir/file.cpp ,迭代器將不包含/D: dirfile.cpp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM