2017-03-14 5 views
0

Ich arbeite an einem C++ - Hausaufgabenprojekt in Code :: Blocks, in dem der zu öffnende Dateiname angegeben wird im ersten Befehlszeilenargument. Die Datei, die ich öffnen möchte, heißt InputFile1.txt. Wenn ich den Code ausführen:C++ Kann eine Datei in Code :: Blocks mit dem vollständigen Pfad, aber nicht mit dem relativen Pfad als Befehlszeilenargument öffnen

#include <iostream> 
#include <cstdlib> 
#include <fstream> 
#include <unistd.h> 
using std::cout; 
using std::ifstream; 
using std::ofstream; 
using std::cerr; 

int main(int argc, char *argv[]) 
{ 
    ifstream inputFile; 

    puts(getcwd(0,1234)); 

    inputFile.open(argv[1]); 
    if (inputFile.is_open()) 
    { 
     cerr << "Couldn't open file " << argv[1]; 
     return(EXIT_FAILURE); 
    } 

    cout << "\nThe file to search is: " << argv[1]; 

    return(EXIT_SUCCESS); 
} 

die Fehlermeldung „Kann Datei nicht öffnen InputFile1.txt“ angezeigt wird. Wenn ich jedoch den vollständigen Pfad zu InputFile1.txt eintippe, wird die Datei erfolgreich geöffnet, wie durch die Ausgabe der Nachricht unten angegeben. Die folgenden Schritte zur Fehlerbehebung wurden durchgeführt:

  1. Erfolgreich geöffnet die Datei mit einem C-Programm auf der gleichen IDE ausgeführt.
  2. Überprüft der Dateiname wurde richtig geschrieben und war das erste Befehlszeilenargument; öffnete auch die Datei mit gedit.
  3. Überprüft den Dateipfad übereinstimmte das aktuelle Arbeitsverzeichnis Ausgabe von der Puts (getcwd () -Anweisung.
  4. Verified das Code :: Blocks Projektausführungsarbeitsverzeichnis (Projekte> Eigenschaften> Build targets - Ausführung Arbeitsanweisungs:) hat die Ausgabe von Schritt 3 abgeglichen, und dass InputFile1.txt im Arbeitsverzeichnis war
  5. Das Arbeitsverzeichnis in ein Verzeichnis um eine Ebene höher geändert und InputFile1.txt in das Verzeichnis kopiert.Auch mit dem vollen Pfad aber erfolgreich nicht als argv [1]

Meine Analyse:.

  • Ich glaube nicht, dass es Dateiberechtigungen ist oder sonst würde es in gedit oder mit dem vollständigen Pfad nicht öffnen.
  • Ich glaube nicht, dass es das Ausführungsarbeitsverzeichnis ist oder es hätte nicht für das C-Programm geöffnet, das in Code :: Blocks ausgeführt wird.
  • Es hat etwas mit meinem C++ - Code oder Code :: Blocks-Konfiguration zu tun.

Alle Einsichten/Hilfe würde sehr geschätzt werden.

+0

Ihre IDE hat wahrscheinlich nicht das gleiche Arbeitsverzeichnis, in dem sich Ihre Anwendung befindet, und ruft Ihre Anwendung mit einem relativen Pfad auf, z. 'debug32 \ my_app.exe'; Daher kann der relative Pfad zu allen Dateien unterschiedlich sein (relative Pfade sind relativ zum Arbeitsverzeichnis und nicht zum Anwendungsverzeichnis). Funktioniert Ihre Anwendung korrekt, wenn sie über die Befehlszeile (außerhalb der IDE) ausgeführt wird? Versuchen Sie auch, 'argv [0] 'zu drucken, um zu überprüfen, wie Ihre Anwendung aufgerufen wurde. –

+0

Ich habe vergessen zu erwähnen, dass ich während meiner Fehlersuche einen Post auf Stack-Überlauf über die Code :: Blocks Project Bin & Obj-Verzeichnisse gelesen habe und versuchte, eine Lösung durch Verschieben einer Kopie in die entsprechenden Verzeichnisse und Öffnen der Datei zu erzwingen. Kein Erfolg. – Crispy

+0

Richard - Danke für Ihre Hilfe! Ich werde auf jeden Fall beim nächsten Mal, wenn ich Probleme beim Öffnen einer Datei in Code :: Blocks habe, den Rat beherzigen. – Crispy

Antwort

0

Es stellt sich heraus, dass der oben aufgeführte Code korrekt funktionierte. Die if-Anweisung in dem folgenden Code:

inputFile.open(argv[1]); 
if (inputFile.is_open()) 
{ 
    cerr << "Couldn't open file " << argv[1]; 
    return(EXIT_FAILURE); 
} 

war das Ergebnis der Auswertung des Ausdrucks inputFile.is_open(), die true zurückgegeben, wenn die Datei erfolgreich geöffnet wurde. Um zu überprüfen, ob die Datei nicht erfolgreich geöffnet wurde, sollte der Ausdruck !inputFile.is_open() verwendet werden. Danke an meinen prof., Der mir geholfen hat, dieses Problem zu lösen - der Fehler war mein eigener.

Verwandte Themen