[英]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.