2016-07-19 13 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

'それは動作しますが、相対パス:

はあなたmain.cppファイルで、その後

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}") 

などCMakeLists.txtファイルを変更する必要があることを行うために、あなたの '.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

これは、ランタイムディレクトリがプロジェクトのソースディレクトリと異なるためです。

私が考えることができる最も簡単な解決策は、プロジェクトのソースディレクトリと同じマクロを定義し、プログラムがその作業ディレクトリを変更してからファイルを開くようにすることです。私は、ファイルを開くために、絶対パスを使用する場合

// 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 –

関連する問題