我正在使用带有文件系统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;
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
"D:"
"\\"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)
为什么打印“ \\”?
在GCC 9.1.0中对此进行测试(请在路径变量中将“ \”更改为“ /”),结果是:
"D:"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)
为什么行为不同?
根据C ++ 17标准,哪个结果正确?
有关Windows路径名的一些信息,请参见https://docs.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file#fully-qualified-vs-relative-paths。
C ++标准对路径迭代器([fs.path.itr] / 4)有这样的说法:
对于通用格式的路径名元素,正向遍历顺序如下:
在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。
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |