使用std::filesystem::directory_iterator时value_type*无法转string问题问询
问题根本原因
std::experimental::filesystem::path的c_str()返回值类型为平台相关:Windows下默认是const wchar_t*,和const char*不兼容,这是你遇到类型转换报错的核心原因。- 原有代码的另一个隐藏问题:
p.path().filename()返回的是临时path对象,调用c_str()拿到指针后,临时对象会立即销毁,指针直接悬空,哪怕类型匹配也会出现运行时异常。 std::to_string仅支持数值类型转字符串,无法处理路径类型的转换需求。
正确实现方案
优先使用filesystem库自带的路径拼接能力,不需要手动处理字符串转换,天然跨平台,还能自动处理路径分隔符的兼容问题:
#include <experimental/filesystem> #include <fstream> namespace fs = std::experimental::filesystem; for (const auto& entry : fs::directory_iterator(dir)) { // 直接用/运算符拼接路径,不需要手动转字符串 fs::path full_path = fs::path("Json") / entry.path().filename(); // C++11及以上版本的std::ifstream支持直接传入path对象构造 std::ifstream comp(full_path, std::ifstream::binary); // 后续文件操作逻辑 if (comp.is_open()) { // 处理文件内容 } }
如果你确实需要拿到std::string类型的文件名做其他处理,调用path类的string()方法即可:
std::string filename = entry.path().filename().string(); std::string full_path_str = "Json/" + filename; std::ifstream comp(full_path_str, std::ifstream::binary);
内容的提问来源于stack exchange,提问作者SomeRandomCoder
相关产品推荐
相关产品推荐

