C++中ifstream使用绝对/相对路径读取文件失败问题求助
问题根因
你通过zenity管道读取到的文件路径末尾携带了换行符\n,是文件打开失败的直接原因:fgets读取行内容时会保留行尾的换行符,zenity --file-selection输出选中路径后会自动追加换行,最终你传入ifstream::open的路径实际为/home/meepmorp/Code/Odin/test/test.odin\n,多出来的换行符导致系统无法匹配到对应文件,触发打开失败。
修复方案
1. 移除路径末尾的多余换行符
在openf函数返回结果前,补充去除行尾换行的逻辑即可:
pclose(pipe); // 新增:移除末尾换行符 if (!result.empty() && result.back() == '\n') { result.pop_back(); } // 兼容Windows场景可选补充:移除回车符 if (!result.empty() && result.back() == '\r') { result.pop_back(); } return result;
2. 可选优化点
- 你当前的文件读取逻辑存在冗余问题:
while(file)判断后调用file.get(),当文件读取到末尾时还会多读取一次EOF值(整数-1),会将无效字符写入结果字符串,可修改为以下逻辑:
std::string readf(std::string filename){ std::string res; std::ifstream file(filename); if(file.is_open()) { char c; while(file.get(c)) { // 仅读取成功时才写入结果 res += c; } }else { // 可引入errno打印更具体的错误原因,需引入头文件 <cerrno> 和 <cstring> std::cout << "failed to open file " << filename << ",错误信息:" << strerror(errno) << std::endl; } return res; }
- C++11及以上版本
ifstream::open已支持直接传入std::string类型参数,不需要额外调用c_str()方法。
内容的提问来源于stack exchange,提问作者xd-sudo
相关产品推荐
相关产品推荐

