2015-01-27 7 views
7

gefunden werden kann Ich habe einen Algorithmus in C++ (main.cpp) und ich verwende CLION zu kompilieren und auszuführen. Algorithmus würde Strings aus Textdatei lesen, aber es ist ein Fehler:Der Versuch, eine Datei in C++ zu öffnen, aber die Datei nicht

nicht data.txt (Datei existiert und mit main.cpp in einem Ordner abgelegt) Könnte öffnen

Wie kann ich es beheben und mache diese Datei für CLion "sichtbar"?

Antwort

4

Wenn Sie oder etwas Ähnliches verwenden und nur "data.txt" übergeben, wird davon ausgegangen, dass sich diese Datei im aktuellen Arbeitsverzeichnis des laufenden Programms (das gerade kompilierte) befindet.

Also, entweder

  1. Geben Sie einen vollständigen Pfad stattdessen wie fopen("/full/path/to/data.txt"), in dem Sie den tatsächlichen vollständigen Pfad

  2. (nicht bevorzugt), Verschieben data.txt auf das Verzeichnis, in dem CLION läuft seine kompilierten Programme von.

(für # 2, hier ist ein hacky Weg, um dieses Verzeichnis zu erhalten)

char buf[1024]; // hack, but fine for this 
printf("%s\n", getcwd(buf, 1024)); 
2

ich einen anderen Weg, um dieses Problem zu lösen gefunden.

@Lou Franco's Lösung kann die Projektstruktur beeinflussen. Wenn ich beispielsweise Code auf einem Server bereitstellen möchte, sollte ich die Ressourcendatei in ein bestimmtes Verzeichnis verschieben.

Was ich tue, ist ändern Sie die CMakeLists.txt, auf Windows,

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "D:\\science\\code\\English-Prediction") 

CMAKE_RUNTIME_OUTPUT_DIRECTORY Verwendung eines CMake Variable, weist er das Arbeitsverzeichnis von CLION Arbeitsverzeichnis.

1
  1. Run/bearbeiten Konfigurationen ...
  2. Wählen Sie Ihre Anwendung (auf dem lefthandside des Fensters)
  3. Geben Verzeichnis Arbeiten
  4. Bewerben

Jetzt können Sie fopen relativ von der Arbeit Verzeichnis.

+0

Dies funktionierte für mich. Vielen Dank – pyetti

0

Fortfahren mit den CMakeLists Variablen , mache ich folgendes. Im Stammverzeichnis meines Projekts erstelle ich ein Verzeichnis, z. B. out.Dann in meinem CMakeLists.txt stelle ich die CMAKE_RUNTIME_OUTPUT_DIRECTORY in dieses Verzeichnis:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out) 

Hinweis, dass kommen müssen, bevor Sie

add_executable(YourProject ${SOURCE_FILES}) 

habe ich könnte auch hinzufügen, dass anstelle fopen() der Verwendung Ich würde es mehr Objekt halten -orientiert unter Verwendung std::ifstream:

std::ifstream inFile("data.txt"); 
// check if it opened without issue... 
if (!inFile) { 
    processError(); // a user-defined function to deal with the issue 
} else { 
    // All is good, carry on... 
    // and when you're done don't forget 
    inFile.close(); 
}