2016-07-19 41 views
1

我有项目目录中的.in文件,当我使用绝对路径打开它的工作文件,但相对路径不工作。CLion C++无法读取/打开项目目录中的纯文件

directoy内容

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; 

} 

没有在代码中没有错误,但能,T读取文件内容相对轻拍H。

+1

'当我使用绝对路径来打开文件时,它的工作原理,但相对路径不工作。“ - 这是因为你的'.in'文件位于* source *目录,但可执行文件是在* build *目录下创建的。同样的问题在[其他问题](http://stackoverflow.com/questions/31495311/clion-c-cant-read-open-txt-file-in-project-directory?rq=1)中有非常相似的描述标题。 – Tsyvarev

+0

尽管它被认为是重复的,但我对这个主题的搜索都将我引到这里。有一个很好的方法来控制可执行文件用于文件I/O的文件夹。请在这里看到我的答案:https://stackoverflow.com/a/48632888/165164 –

回答

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... 
} 
+0

您可以更改exe的工作目录,而无需编辑构建文件。请参阅我的答案在这里:https://stackoverflow.com/a/48632888/165164 –