[英]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:
的磁盤指示符,后跟該磁盤上的根目錄, \\
,然后是dir
, file.cpp
的路徑。 根據Windows, D:
是根名稱,因此\\
是根目錄。 你可以有D:dir\\file.cpp
,但請注意,這是一個相對路徑。
在gcc上,如果沒有在Windows上, D:
將被視為常規目錄名(與./D:/dir/file.cpp
相同)。 因此,沒有根名稱或根目錄。 如果你已經不是了/D:/dir/file.cpp
,迭代器將不包含/
, D:
dir
, file.cpp
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.