试图用C ++打开文件,但找不到该文件

时间:2015-01-27 21:19:25

标签: clion

我在 C ++ main.cpp )中有一个算法,我使用 CLION 来编译和运行它。算法会从文本文件中读取字符串,但是有一个错误:

无法打开data.txt (文件存在并放在 main.cpp 的一个文件夹中)

如何修复它并使此文件对CLION“可见”?

4 个答案:

答案 0 :(得分:4)

如果您正在使用fopen或类似的东西而只是传递"data.txt",则假定该文件位于正在运行的程序的当前工作目录中(您刚编译的那个)。

所以,

  1. 改为提供完整路径,例如fopen("/full/path/to/data.txt"),您使用实际的完整路径

  2. (不可取),将data.txt移动到CLion运行其编译程序的目录。

  3. (对于#2,这是获取该目录的一种hacky方式)

    char buf[1024]; // hack, but fine for this
    printf("%s\n", getcwd(buf, 1024));
    

答案 1 :(得分:2)

我找到了解决这个问题的另一种方法。

@Lou Franco的解决方案可能会影响项目结构。例如,如果我在服务器上部署代码,我应该将资源文件移动到特定目录。

我在Windows上使用

修改CmakeLists.txt
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "D:\\science\\code\\English-Prediction")

CMAKE_RUNTIME_OUTPUT_DIRECTORY 是一个CMake变量,它指定了CLion工作目录的工作目录。

答案 2 :(得分:1)

  1. 运行/编辑配置...
  2. 选择您的应用程序(在窗口的左侧)
  3. 指定工作目录
  4. 应用
  5. 现在你可以fopen相对于工作目录。

答案 3 :(得分:0)

继续使用CMAKE_RUNTIME_OUTPUT_DIRECTORY CMakeLists变量,我执行以下操作。在我的项目的根目录中,我创建了一个目录,例如out。然后,在我的CMakeLists.txt中,我将CMAKE_RUNTIME_OUTPUT_DIRECTORY设置为该目录:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out)

注意,必须在你有

之前
add_executable(YourProject ${SOURCE_FILES})

我可能还会添加,而不是使用fopen()我会通过std::ifstream使其更加面向对象:

std::ifstream inFile("data.txt");
// check if it opened without issue...
if (!inFile) {
    processError(); // a user-defined function to deal with the issue
} else {
    // All is good, carry on...
    // and when you're done don't forget 
    inFile.close();
}