2016-07-19 59 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 –