调用std::filesystem remove_filename()后路径为空:Bug还是特性?
问题分析:
fs::path::remove_filename()返回空字符串的原因 这不是C++标准库的Bug,是你代码中的字符串转义错误导致的问题。
核心原因
你定义路径字符串时使用了单个反斜杠:
std::string fpath = ".\png\DUMMY-AB-42-L.PNG";
在C++中,反斜杠\是转义字符,必须用双反斜杠\\才能表示实际路径中的反斜杠。你写的\p和\D属于未定义的转义序列,编译器的处理行为是实现定义的——它不会按照你预期的方式保留\字符,而是会错误解析这些序列,最终导致fs::path无法识别路径里的目录结构,把整个字符串当成了一个独立的文件名。
当调用remove_filename()时,因为路径被解析为没有目录前缀的单个文件名,移除后自然返回空字符串。
修复方案
有两种方式修正路径字符串:
- 使用双反斜杠转义:
std::string fpath = ".\\png\\DUMMY-AB-42-L.PNG"; - 使用C++11及以上支持的原始字符串字面量,无需转义反斜杠:
std::string fpath = R"(.\png\DUMMY-AB-42-L.PNG)";
验证结果
修改后,程序输出会符合预期:
Hello World! fpath:=.\png\DUMMY-AB-42-L.PNG fs_fpath_str:=.\png\DUMMY-AB-42-L.PNG fs_fpath_str:=.\png
内容的提问来源于stack exchange,提问作者schnedan
相关产品推荐
相关产品推荐

