CLion C++ не может читать/открывать обычный файл в каталоге проекта

У меня есть файл .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;

}

в коде нет ошибок, но невозможно прочитать содержимое файлов с относительным путем.


person mohamed abdallah    schedule 19.07.2016    source источник
comment
when i use absolute path to open the file it works but relative path not working. — это потому, что ваш файл .in находится в каталоге исходный код, а исполняемый файл создается в каталоге build. Та же проблема описана в другом вопросе с очень похожим заголовком.   -  person Tsyvarev    schedule 19.07.2016
comment
Мои поиски по этой теме привели меня сюда, несмотря на то, что она считается дубликатом. Есть хороший способ контролировать, какую папку исполняемый файл использует для файлового ввода-вывода. См. мой ответ здесь: stackoverflow.com/a/48632888/165164   -  person Anne Gunn    schedule 06.02.2018


Ответы (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...
}
person Some programmer dude    schedule 19.07.2016
comment
Вы можете изменить рабочий каталог исполняемого файла, не редактируя файлы сборки. См. мой ответ здесь: stackoverflow.com/a/48632888/165164 - person Anne Gunn; 06.02.2018