2016-07-22 38 views
3

Ich versuche, eine Übung aus einem Lehrbuch zu replizieren, jedoch liest die Datei nie und so wird die if-Anweisung ausgelöst, mir zu sagen, dass ich die Datei nicht gelesen habe. Ich habe keine Fehlermeldung oder Warnungen. Ich bin sicher, dass ich etwas Grundlegendes vermisse, aber ich weiß einfach nicht, was es sein könnte .... Ich benutze OSX, Clang7.0, benutze Qt (aber ich habe es auch in erhabenen Text versucht und es scheitert auch dort hier C++ Basis-Datei-E/A, Fehler beim Lesen

) ist der Code:

#include <fstream> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    ifstream file_reader ("myfile.txt"); 
    if (!file_reader.is_open()) 
    { 
     cout<<"Could not open file!"<<'\n'; 
    } 
    int number; 
    file_reader >> number; 
    cout<<number; 
} 

die Datei wird im selben Verzeichnis wie die Programmdateien ist. Es ist eine TXT-Datei einfach enthalten:

12 a b c 

habe ich versucht, den vollständigen Pfad setzen und einen Blick auf einige ähnliche Themen hatte aber es scheint nicht das gleiche Problem wie this

Dank zu sein für jede Hilfe im Voraus

+0

funktioniert gut mit GCC-Version 4.6.4 auf Ubuntu 12.04, ist die TXT-Datei im selben Verzeichnis wie die ausführbare Datei? – Jonas

+0

Es funktioniert für mich unter Linux. Bitte fügen Sie '<< std :: endl 'zu Ihrer Ausgabeanweisung hinzu und sehen Sie, was passiert – GMichael

+0

Bitte geben Sie weitere Informationen an. Was ist die Ausgabe? Hast du das Debuggen probiert? Der Code sieht gut aus, abgesehen von der fehlenden Rückgabe in if body und am Ende der Hauptfunktion. – stryku

Antwort

2

Wie von anderen erwähnt, kompilieren viele IDEs Ihr Programm in einem anderen Verzeichnis, aber sie bieten im Allgemeinen auch eine Möglichkeit, erforderliche Dateien an denselben Speicherort zu kopieren. Xcode ist ein Beispiel dafür. Wenn Sie herausfinden, wo Ihr Programm erstellt wurde, setzen Sie myfile.txt in diesem Verzeichnis, rufen Sie Ihr Programm als `./myprogram 'auf, und Ihr Code wird funktionieren.

Wenn Sie sehen möchten, in welchem ​​Verzeichnis Ihr Programm läuft, können Sie getenv("PWD") verwenden, um das Arbeitsverzeichnis zu suchen, und dann tun, was Sie brauchen, um damit zu arbeiten.

#include <fstream> 
#include <iostream> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    cout << "PWD = " << getenv("PWD") << endl; // Inspect working directory 

    ifstream file_reader ("myfile.txt"); 
    if (!file_reader.is_open()) 
    { 
     cout << "Could not open file!" << endl; 
     return -1; // If the file wasn't opened, there's no point in going on 
    } 
    int number; 
    file_reader >> number; 
    cout << number << endl; 
    return 0; // Always return 0 from main() if successful 
} 

Wie Sie entdeckt, Documents auf OS X lebt in Ihrem Home-Verzeichnis, das so etwas wie /Users/myusername wäre. Doppelte Anführungszeichen sind in der Shell erforderlich, wenn Ihr Pfad- oder Dateiname Leerzeichen oder Sonderzeichen enthält, aber in Ihrem Programm nicht erforderlich ist (d. H. Ihre ifstream() Initialisierung), weil das Argument nicht von einer Shell interpretiert wird. Das ~ wird ebenfalls von der Shell interpretiert, aber nicht von den Standardbibliotheken oder dem Kernel, weshalb es in Ihrem Programm nicht funktioniert: ~/ ist kein Verzeichnisname.

+0

was genau ist getenv (" PWD ") soll ausgeben Es ist wirklich mit meinem Programm verwechselt. (Ansonsten nette Antwort) –

+0

'PWD' ist die Umgebungsvariable für das aktuelle Arbeitsverzeichnis. Wenn ich diesen Code aus meinem'/home/josh' -Verzeichnis ausführen würde, 'getenv (" PWD ") 'würde'/home/josh' zurückgeben.Wenn Sie sagen, dass dies "mit meinem Programm verwechselt", sagst du, dass das Programm segfaults? Wenn ja, dann nehme ich an, dass Sie dies in einer IDE laufen, die nicht vorbei ist die "PWD" -Umgebung. Welche IDE verwenden Sie? –

+0

Wenn Sie sehen möchten, welche Umgebungsvariablen an Ihr Programm übergeben werden, verwenden Sie 'int main (int argc, char * argv [], char ** env) {while (* env) std :: cout << * env ++ << std :: endl; zurückgeben 0;} '. –