You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 19:12:01