2009-06-08 19 views
2

So in Code :: Blöcke in Ubuntu (neueste).absoluter Pfad ... verwirrt (ubuntu)

Ich habe ein Projekt, in dem ich eine Datei lade und eine Zahl von ihm lese.

#include <fstream> 
using namespace std; 
int main(){ 
    ifstream in("data/file.t"); 
    int n;in>>n; 
} 

jetzt mit einem cout<<n es zeigt -1203926 (und andere Zufallszahlen), obwohl die Zahl in der Datei 0 ist.

ist, wo die Binärdatei ist (ich meine Daten und Binärdateien sind im selben Ordner (Programm)) und ich habe erwartet, dass der Pfad relativ in Windows sein ... aber nur wenn ich den vollständigen Pfad /home/csiz/Desktop/C++/ep0/Program/data/file.t es bekomme ich eine 0.

Können Sie mir sagen, wie man es zu einem relativen Pfad macht? Ich würde etwas bevorzugen, damit in Windows der Code ohne Änderungen kompilieren kann.

+0

Warum der Downvote? Dies ist eine gültige Frage. – Zifre

+0

Ich hoffe, dass Sie Ihren echten Code einrücken ... – Zifre

Antwort

0

Nach der Verwendung des absoluten Pfades habe ich den Fehler gefunden.

In Codeblocks können Sie das Arbeitsverzeichnis eingeben (in dem es das Programm starten wird) und ich versehentlich ein. da drin.

0

Wenn sich die Binärdatei im Verzeichnis data befindet, verwenden Sie file.t statt data/file.t.

+4

Nicht zu erwähnen, dass der Pfad relativ zu, wo Sie * bin * die Binärdatei von, nicht wo es sich befindet ... – workmad3

+0

Daten und Binärdateien sind im selben Ordner, Codeblocks läuft die exe wie es aus diesem Ordner lief (Ich versuchte auch, aus dem Terminal zu laufen ...) – csiz

0

portable Pfade für Windows und Linux bekommen Sie müssen entweder Ihre eigenen Methoden schreiben um die Dateipfade anzupassen oder vorzugsweise Bibliothek wie boost::filesystem zu verwenden.

Ich habe Boost :: Dateisystem in meinen Projekten verwendet und ich empfehle es. Es ist einfach, einen Pfad zu erstellen, zu prüfen, ob eine Datei existiert, Verzeichnisse zu erstellen und so weiter. Vielleicht steile Lernkurve für Anfänger C++ - Programmierer, aber die grundlegenden Dinge wie Erstellen von Dateipfad sollte einfach sein.

+0

so ging ein anderer Downvoter vorbei zum Spaß (?) Downvoting ... da es keinen Kommentar zu dem Problem gibt, das er in meinem Vorschlag von Cross-Plattform gefunden Bibliothek, um den Pfad ohne Code-Änderung auf Ubuntu und Windows zugreifen ... so weit ich weiß, Boost ist gut für diese Art von Denken ... – stefanB

+0

Das gleiche hier - aber ich hörte auf, über diese Art von Dingen zu denken .. – bernhardrusch

0

Der einzige Grund, warum dieser relative Pfad in "Windows" funktioniert, ist, dass Ihre IDE die Binärdatei in .. statt in ausführt. Wenn Sie MSVC ausführen, können Sie sicher sein.

So ändert Code

 
#include 
using namespace std; 
int main() { 
    ifstream in("file.t"); 
    int n; 
    in>>n; 
} 

dann IDE data/ aktuelles Verzeichnis ändern -> Port komplett! :)

0

Das bedeutet, dass Ihr aktuelles Verzeichnis beim Ausführen des Programms nicht auf die Stelle eingestellt ist, an der es sein sollte (es ist wahrscheinlich in Ihrem Home-Verzeichnis). Versuchen Sie das Programm wie folgt ausgeführt werden:

cd whatever_dir_is_above_data 
./my_prog 

EDIT: Oops, müssen Sie wahrscheinlich ./ auch vor dem Programm, da . wahrscheinlich nicht in Ihrem Pfad ist (ich habe es vergessen, weil ich stellte es immer in meinem Weg so Ich muss es nicht tippen).

+0

ich don ' t bekommen: csiz @ csiz-desktop: ~/Desktop/C++/ep0/Programm $ ep0 bash: ep0: Befehl nicht gefunden ep0 ist im Programmverzeichnis – csiz

2

Der Pfad ist relativ zum aktuellen Arbeitsverzeichnis, nicht zu dem Verzeichnis, unter dem sich Ihre Anwendung befindet.

Eine einfache Lösung wäre, einen SH-Skript zu haben, die das Arbeitsverzeichnis in Ihr Anwendungsverzeichnis ändert, und führt dann die App, etwa so:

$!/bin/sh 

cd `dirname $0` # changes the working dir to the script's dir 

./application-name # executes your application 

# no need changing back to your previous working directory 
# the chdir persists only until the end of the script 

Es ist nicht ungewöhnlich für Anwendungen Initialisierungsskripts zu haben.

Sie könnten dies auch in Ihrer Hauptanwendung C/C++ tun. Da der Pfad der ausführbaren Datei in argv [0] der Hauptmethode übergeben wird, können Sie dasselbe tun.

Aber ich würde davon abraten, denn wenn Sie Ihre Anwendung unter Linux neu verteilen, werden Datendateien normalerweise in einem anderen Verzeichnis (normalerweise/var/lib) als Ihre ausführbaren Dateien (normalerweise/usr/bin) abgelegt.

So ist es entweder ein Initialisierungsskript oder auf Reisen, den Pfad des Datenverzeichnisses in einer Umgebungsvariablen, es ist wie so ausführen ...

MY_APP_DATA_PATH=/var/lib/my-app /path/to/executable 
+0

Ich denke, du meinst 'dirname' anstatt' basename' – KayEss

+0

Ja, tut mir leid. Behoben. –

0

kopieren das Verzeichnis/data in das Verzeichnis ist des Projektes oder wo die Binärdatei kompiliert wird.

relative Pfade sind die gleichen für Linux und Windows (ja genau die gleiche Verwendung, ich benutze sie jeden Tag in meiner Cross-Plattform-Anwendung Codierung).

nur für CASE, d. H. Alle Linux-Pfade sind CASE-SENSITIVE. es ist etwas, was wir vermissen, wenn wir von Windows nach Linux bewegen

Verwandte Themen