【问题标题】:CLion C++ can't read/open plain file in project directory [duplicate]CLion C++ 无法读取/打开项目目录中的纯文件 [重复]
【发布时间】:2016-07-19 07:06:52
【问题描述】:

当我使用绝对路径打开文件时,我在项目目录中有 .in 文件,但相对路径不起作用。

目录内容

main.cpp
CMakeLists.txt
milk2.in

CMakeLists.txt

cmake_minimum_required(VERSION 3.3)
project(project)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES  main.cpp )
add_executable(project ${SOURCE_FILES})

main.cpp

#include <iostream>

using namespace std;

int main() {

pair<int, int> periods[5000];
int lineCount = 0;
freopen("milk2.in", "r", stdin);

cin >> lineCount;


for (int j = 0; j < lineCount; ++j) {

    cin >> periods[j].first >> periods[j].second;

}

int startNode = periods[0].first, endNode = periods[0].second, milkMax = 0, freeMax = 0;

for (int i = 1; i < lineCount; ++i) {
    if (periods[i].first <= endNode) {
        endNode = periods[i].second;
        if ((endNode - startNode) > milkMax)
            milkMax = endNode - startNode;
    } else {
        if ((periods[i].first - endNode) > freeMax)
            freeMax = periods[i].first - endNode;
    }
}

cout << milkMax << " " << freeMax << endl;

}

代码中没有错误,但无法读取具有相对路径的文件内容。

【问题讨论】:

  • when i use absolute path to open the file it works but relative path not working. - 这是因为您的 .in 文件位于 source 目录中,但可执行文件是在 build 目录中创建的。 other question 中描述了同样的问题,标题非常相似。
  • 尽管它被认为是重复的,但我对这个主题的搜索都让我来到了这里。有一种很好的方法可以控制可执行文件用于文件 I/O 的文件夹。请在此处查看我的答案:stackoverflow.com/a/48632888/165164

标签: c++ cmake clion


【解决方案1】:

那是因为运行时目录与项目源目录不同。

我能想到的最简单的解决方案是定义一个与项目源目录相同的宏,让程序将其工作目录更改为该目录,然后打开文件。

为此,您需要修改 CMakeLists.txt 文件,如

cmake_minimum_required(VERSION 3.3)
project(project)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES  main.cpp )
add_executable(project ${SOURCE_FILES})
target_compile_definitions(project
    PUBLIC -DPROJECT_DIRECTORY="${CMAKE_SOURCE_DIR}")

然后在您的main.cpp 文件中:

// Header file for chdir call
#ifdef __linux__
# include <unistd.h>
#endif
#ifdef _WIN32
# include <direct.h>
#endif

int main() {
#ifdef __linux__
    chdir(PROJECT_DIRECTORY);
#endif
#ifdef _WIN32
    _chdir(PROJECT_DIRECTORY);
#endif

    // Rest of code here...
}

【讨论】:

猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多