繁体   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