2016-07-19 7 views
1

Ich habe .in-Datei im Projektverzeichnis, wenn ich absolute Pfad verwenden, um die Datei zu öffnen, funktioniert es aber relativer Pfad nicht funktioniert.CLion C++ kann einfache Datei im Projektverzeichnis nicht lesen/öffnen

Directoy Inhalt

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; 

} 

es keine Fehler im Code, sondern kann, t-Dateien lesen Inhalt mit relativem pat h.

+1

'wenn ich absoluten Pfad verwenden, um die Datei zu öffnen, es funktioniert, aber relativen Pfad funktioniert nicht. - Dies liegt daran, dass sich Ihre '.in'-Datei im * source * -Verzeichnis befindet, die ausführbare Datei jedoch im * build * -Verzeichnis erstellt wird. Das gleiche Problem ist in der [anderen Frage] (http://stackoverflow.com/questions/31495311/clion-cc-cant-read-open-txt-file-in-project-directory?rq=1) mit sehr ähnlich beschrieben Titel. – Tsyvarev

+0

Meine Suchanfragen für dieses Thema alle landen mich hier, obwohl es als ein Duplikat betrachtet wird. Es gibt eine nette Möglichkeit zu steuern, welchen Ordner die ausführbare Datei für Datei-E/A verwendet. Bitte sehen Sie meine Antwort hier: https://Stackoverflow.com/a/48632888/165164 –

Antwort

1

Das liegt daran, dass das Laufzeitverzeichnis nicht mit dem Projektquellverzeichnis identisch ist.

Die einfachste Lösung, die ich mir vorstellen kann, besteht darin, ein Makro zu definieren, das dem Quellverzeichnis des Projekts entspricht, das Programm sein Arbeitsverzeichnis ändern und dann die Dateien öffnen muss.

zu tun, dass Sie die CMakeLists.txt Datei wie

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

Und dann in Ihrer main.cpp Datei ändern müssen:

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

Sie können das Arbeitsverzeichnis der EXE ändern, ohne die Build-Dateien bearbeiten zu müssen. Bitte sehen Sie meine Antwort hier: https://Stackoverflow.com/a/48632888/165164 –

Verwandte Themen