2 Stimmen

absoluter Pfad... verwirrt (ubuntu)

Also in Code::Blocks in Ubuntu (aktuell).

Ich habe ein Projekt, in dem ich eine Datei lade und eine Zahl aus ihr lese.

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

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

data ist der Ort, an dem sich die Binärdatei befindet (ich meine, dass sich die Daten und die Binärdatei im selben Ordner (Programm) befinden), und ich habe erwartet, dass der Pfad relativ ist, wie in Windows... aber nur, wenn ich den vollständigen Pfad eingebe /home/csiz/Desktop/C++/ep0/Program/data/file.t wird es mir eine 0 .

Können Sie mir sagen, wie ich einen relativen Pfad erstellen kann? Ich würde etwas bevorzugen, so dass in Windows der Code ohne Änderungen kompilieren kann.

2voto

Alexandru Nedelcu Punkte 7914

Der Pfad bezieht sich auf das aktuelle Arbeitsverzeichnis, nicht auf das Verzeichnis, in dem sich Ihre Anwendung befindet.

Eine einfache Lösung wäre ein SH-Skript, das das Arbeitsverzeichnis in das Verzeichnis Ihrer Anwendung ändert und dann Ihre Anwendung ausführt, 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, dass Anwendungen über Initialisierungsskripte verfügen.

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

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

Es handelt sich also entweder um ein Initialisierungsskript oder um die Übergabe des Pfads Ihres Datenverzeichnisses in einer Umgebungsvariablen, die wie folgt ausgeführt wird ...

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

1voto

bernhardrusch Punkte 11330

Je pense Boost-Dateisystem-Bibliothek würde helfen, auch wenn ich keine Erfahrung damit habe (nur mit anderen Boost-Bibliotheken - die haben gut funktioniert)

0voto

xsl Punkte 16574

Befindet sich die Binärdatei im data Verzeichnisnutzung file.t 代わりに data/file.t .

0voto

stefanB Punkte 72857

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

Ich habe boost::filesystem 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 Datei-Pfad sollte einfach sein.

0voto

Jonas Byström Punkte 23505

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

Ändern Sie also den Code in

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

dann ändern Sie das aktuelle IDE-Verzeichnis in data/ -> Portierung abgeschlossen! :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X