8

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

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

如何修复它并使该文件对 CLion “可见”?

4

4 回答 4

6

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

所以,要么

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

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

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

char buf[1024]; // hack, but fine for this
printf("%s\n", getcwd(buf, 1024));
于 2015-01-27T21:25:30.907 回答
4
  1. 运行/编辑配置...
  2. 选择您的应用程序(在窗口的左侧)
  3. 指定工作目录
  4. 申请

现在您可以fopen相对地从工作目录中。

于 2016-06-14T14:06:03.697 回答
2

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

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

我所做的是在 Windows 上修改 CmakeLists.txt,使用

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "D:\\science\\code\\English-Prediction")

CMAKE_RUNTIME_OUTPUT_DIRECTORY是一个 CMake 变量,它分配 CLion 工作目录的工作目录。

于 2015-11-08T03:23:52.993 回答
0

继续使用CMAKE_RUNTIME_OUTPUT_DIRECTORYCMakeLists 变量,我执行以下操作。在我的项目的根目录中,我创建了一个目录,例如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();
}
于 2017-05-07T22:18:02.487 回答