gpt4 book ai didi

c++ - 为什么path的迭代器在遍历时返回 "\\"?

转载 作者:IT老高 更新时间:2023-10-28 23:19:12 26 4
gpt4 key购买 nike

我正在使用带有文件系统 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 标准,哪个结果是正确的?

最佳答案

https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#fully-qualified-vs-relative-paths有关 Windows 路径名的一些信息。

C++ 标准对路径迭代器 ([fs.path.itr]/4) 有这样的说法:

For the elements of the pathname in the generic format, the forward traversal order is as follows:

  • The root-name element, if present.
  • The root-directory element, if present. [ Note: The generic format is required to ensure lexicographical comparison works correctly. — end note]
  • Each successive filename element, if present.
  • An empty element, if a trailing non-root directory-separator is present.

在 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.

关于c++ - 为什么path的迭代器在遍历时返回 "\\"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56902084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com