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

CLion环境C++17中ifstream无法打开同目录文本文件读取问题求助

问题原因

CLion搭配Ninja构建C++项目时,程序运行的默认工作目录是构建产物生成的目录(一般是项目下的cmake-build-debug/cmake-build-release文件夹),不是你存放main.cpp、printTest.cpp的源码目录。你代码里写的相对路径"test.txt",会让程序从运行时工作目录下查找文件,自然找不到放在源码目录的test.txt,触发打开失败的分支。

修复&排查方案
  • 第一步先确认实际查找路径:在打开失败的分支中增加当前工作路径打印逻辑,先明确程序找文件的基准目录,需要引入<filesystem>头文件(C++17原生支持):
// 头文件区增加
#include <filesystem>

// 原有打开失败的else分支修改为
else {
    std::cout <<"Unable to open the text file..." <<std::endl;
    std::cout << "当前程序查找文件的基准工作目录为:" << std::filesystem::current_path() << std::endl;
}
  • 快速验证方案:把你的test.txt文件复制到上一步打印出的工作目录下,重新运行程序即可正常读取,不需要修改任何路径配置。

    注意:不建议长期把业务资源文件放在cmake-build-*这类构建目录下,CLion执行清理构建操作时会清空该目录内容,容易造成文件丢失。

  • IDE配置修正方案(推荐):
    1. 点击CLion右上角运行配置的下拉按钮,选择Edit Configurations...
    2. 选中你当前运行的可执行程序目标,找到Working directory配置项,将路径修改为你存放test.txt、源码文件的项目源码目录
    3. 保存配置后重新运行程序,相对路径就会以源码目录为基准查找文件,不需要挪动文件位置。
  • 代码层面适配方案(不依赖IDE配置):
    利用C++17的filesystem能力和编译器内置宏__FILE__(该宏会记录当前cpp文件的完整路径),直接拼接出test.txt的绝对路径,不管程序在哪运行、IDE怎么配置都能准确定位到源码目录下的文件,修改后的代码如下:
#include <iostream>
#include <fstream>
#include <string>
#include <filesystem>
// 删掉重复引入的两次<iomanip>、冗余的stdlib.h头文件,没有用到对应功能
#include "printTest.h"

namespace fs = std::filesystem;

void printTest::print() {
    std::string line;
    // 基于当前cpp文件的路径,拼接同目录下的test.txt路径
    fs::path target_file = fs::path(__FILE__).parent_path() / "test.txt";
    std::ifstream textFile(target_file, std::ios::in);

    if(textFile.is_open())
    {
        while(std::getline(textFile, line))
        {
            std::cout << line << "\n";
        }
        textFile.close();
    } else {
        std::cout <<"Unable to open the text file..." <<std::endl;
        std::cout << "尝试访问的文件路径:" << target_file << std::endl;
    }
}

小提示:你原有代码中重复包含了两次<iomanip>头文件,还引入了没有用到的<stdlib.h>,可以直接删掉减少冗余。

内容的提问来源于stack exchange,提问作者Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:57:13