2012-04-04 4 views
2

Am Ende einer Simulation möchte ich einige Ergebnisse als eine angehängte Zeile in eine Datendatei schreiben. Der Code, den ich verwende, ist der folgende, in dem angenommen werden kann, dass outFile korrekt als std::ofstream zugewiesen wurde, dass output_file ein std::string ist, der einen gültigen Pfad zu einer Datei enthält, die noch nicht existiert, und dass die Variablen in der Datei ausgedruckt werden nur int Typen, die Werte während der Simulation erhalten.Verwendung von `ofstream` scheint weder zu erstellen noch in Datei zu schreiben

outFile.open(output_file.c_str(), std::ios::out | std::ios::app); 
outFile << num_nodes << ", " << tot_s << ", " << tot_c << ", " << tot_d << std::endl; 
outFile.close(); 

Ich habe überprüft, ob es richtig die Datei mit der ofstream::is_open() Funktion öffnet und es kehrt false. Ich kann jedoch nicht herausfinden warum. Ich habe es mit vielen verschiedenen Dateinamen und Verzeichniswegen versucht, die ich überprüft habe und sie sind gültig (keine Tippfehler, etc.)

Die Datei, die geschrieben wird, ist gerade in einen Ordner auf dem Schreibtisch, den ich erstelle Dateien die ganze Zeit, so sehe ich nicht, wie es ein Berechtigungsproblem sein könnte. Wenn es ein Berechtigungsproblem war, wie kann ich das überprüfen?

Sonst kann was sonst verhindern, dass es in die Datei schreibt?

Hinzugefügt:

Im Anschluss an den Kommentaren nach oben, nach einem Aufruf perror() Hinzufügen es die „Keine solche Datei oder das Verzeichnis“ Fehler anzeigt. Der Dateipfad in Frage:

/home/ely/Desktop/Evolutionary_Dynamics/GamesOnCycle/data/test.data 

ich diese Datei erstellt werden soll, und alle Verzeichnisse in diesem Pfad existieren, es ist alles richtig geschrieben, usw., und es gibt keine seltsamen Berechtigungsprobleme mit dem GamesOnCycle Ordner oder sein Datenunterordner. Beachten Sie, dass es sich um ein Linux-System handelt (Ubuntu 11.04), so dass die Schrägstriche für den Dateipfad korrekt sind, es sei denn, ich verpasse etwas, das C++ in w.r.t. Dateipfade.

+2

obwohl perror() zu sehen ist, dass Sie c Stil es noch nach ofstream.open verwenden, um die Fehlermeldung zu erhalten. – keety

+1

Sind Sie sicher, dass die Pfade doppelte Backslashes verwenden? – chris

+0

Es ist auf einem Linux-System, so dass die Pfade alle Schrägstriche haben. Es druckt den Dateinamen korrekt aus, wenn er von Benutzereingaben eingelesen wird, also hat er zumindest den richtigen Pfad in der 'std :: string'. – ely

Antwort

3

Dies könnte aus verschiedenen Gründen geschehen.

1) Die Datei ist bereits geöffnet.

2) Alle Verzeichnisse im Dateipfad werden nicht erstellt.

3) Fehlende Dateiberechtigungen.

Für eine zusätzliche Referenz, bitte When will ofstream::open fail?

2

Das mag schlecht klingen, aber sind Sie auf Windows oder Linux? Wenn Windows für Ihren Dateipfad ein doppeltes "\" in Ihrer Zeichenkette hat, oder nur eines? Wenn nur einer, du legst die Charaktere nicht in deinen Pfad, von denen du denkst, dass du sie bist. Um sicher zu gehen, verwenden Sie das Zeichen "/".

Also, wenn Sie hatte dies:

string pathname = "C:\Users\me\Desktop"; 

, die nicht ein gültiger Pfad ist. Sie entziehen "\ U", "\ m" und "\ D" in Ihre Zeichenfolge. Sie würden dies benötigen:

string pathname = "C:\\Users\\me\\Desktop"; 

oder

string pathname = "C:/Users/me/Desktop"; 

Die "/" ist nicht ein Escape-Zeichen.

Es ist, was mir wahrscheinlich erscheint.

+0

Aktualisierte den Beitrag. Ich bin auf Ubuntu. – ely

Verwandte Themen