C++报错:不存在const std::filesystem::path到char*的合适转换函数
解决
std::filesystem::path到char*的转换错误 你的报错根源是entry.path()返回的是std::filesystem::path类型对象,而read_file函数接收的是char[260](实际会退化为char*),两者类型不兼容,无法直接转换。下面给出两种可行的解决方法:
方案1:改用现代C++文件流(推荐)
直接让read_file接收std::filesystem::path参数,用C++标准库的ifstream代替C风格的fopen,彻底避免类型转换问题,同时代码更安全规范:
#include <iostream> #include <fstream> #include <filesystem> #include <string> namespace fs = std::filesystem; void read_file(const fs::path& file_path); int main(){ for (const auto& entry : fs::recursive_directory_iterator("C:\\Users\\malar\\AppData\\Local")){ try{ if (entry.path().extension() == ".txt"){ read_file(entry.path()); } } catch (const fs::filesystem_error&){ continue; } } return 0; } void read_file(const fs::path& file_path){ std::ifstream rf(file_path); if (!rf.is_open()){ std::cout << "File: " << file_path << " Cannot be opened\n"; return; } std::string line; while (std::getline(rf, line)){ std::cout << line << '\n'; } rf.close(); std::cout << "File Closed\n"; }
说明:
std::ifstream原生支持std::filesystem::path参数,无需手动转换- 用
getline按行读取,避免原代码中fread可能导致的缓冲区溢出问题 - 去掉了全局
using namespace,改用命名空间别名fs,减少命名冲突风险
方案2:保留C风格文件操作,转换路径为const char*
如果坚持使用C风格的文件API,可以通过std::filesystem::path的c_str()方法获取const char*类型的路径字符串,同时修改read_file的参数类型:
#include <iostream> #include <cstdio> #include <filesystem> namespace fs = std::filesystem; void read_file(const char* file_path); int main(){ for (const auto& entry : fs::recursive_directory_iterator("C:\\Users\\malar\\AppData\\Local")){ try{ if (entry.path().extension() == ".txt"){ read_file(entry.path().c_str()); } } catch (const fs::filesystem_error&){ continue; } } return 0; } void read_file(const char* file_path){ FILE* rf = fopen(file_path, "r"); if (rf == nullptr){ std::cout << "File: " << file_path << " Cannot be opened\n"; return; } char Buffer[260]; // fread返回读取的元素数量,需判断是否大于0而非和NULL比较 while (size_t read_count = fread(Buffer, 1, sizeof(Buffer)-1, rf)){ Buffer[read_count] = '\0'; // 手动添加字符串结束符,避免乱码 std::cout << Buffer << '\n'; } fclose(rf); std::cout << "File Closed\n"; }
注意点:
c_str()返回的是const char*,所以read_file的参数要改成const char*,不能强制转成非const的char*(不安全)- 原代码中
fread的判断逻辑错误,fread返回的是成功读取的元素数,需和0比较而非NULL - 读取时要给缓冲区留一个位置放
'\0',确保输出的字符串是合法的C风格字符串
内容的提问来源于stack exchange,提问作者I eat pizza with pineapples
相关产品推荐
相关产品推荐

