Question

Ainsi, dans Code :: Blocks dans Ubuntu (dernier).

J'ai un projet dans lequel je charge un fichier et lu un numéro de celui-ci.

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

avec un cout<<n il montre -1203926 (et d'autres nombres aléatoires) si le nombre dans le fichier est 0.

data est où le binaire est (je veux dire les données et les binaires sont dans le même dossier (programme)) et je me attendais le chemin d'être relatif comme dans Windows ... mais seulement si je mets le chemin complet /home/csiz/Desktop/C++/ep0/Program/data/file.t ce sera obtenir moi un 0.

Pouvez-vous me dire comment faire un chemin relatif? Je préférerais quelque chose pour que dans Windows le code peut compiler sans aucune modification.

Était-ce utile?

La solution 8

Après avoir utilisé le chemin absolu, je trouve l'erreur.

Dans CodeBlocks vous pouvez entrer dans le répertoire de travail (que Wich il va lancer le programme) et je accidentellement mis un. là-dedans.

Autres conseils

Le chemin est relatif au répertoire de travail courant, pas dans le répertoire de votre application est sous.

Une solution simple serait d'avoir un script SH qui change le répertoire de travail dans le répertoire de votre application, et exécute ensuite votre application, comme suit:

$!/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

Il est pas rare que les applications d'avoir des scripts d'initialisation.

Vous pouvez aussi le faire dans votre principale application C / C ++. Depuis le chemin de l'exécutable est passé dans le argv de la principale méthode [0], vous pouvez faire la même chose.

Mais je conseillerais contre elle, parce que quand vous redistribuant votre application sur Linux, les fichiers de données sont généralement placés dans un répertoire différent (généralement / var / lib) que vos exécutables (généralement /usr/bin).

Il est donc soit un script d'initialisation, ou passer le chemin de votre répertoire de données dans une variable d'environnement, l'exécution comme si ...

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

Je pense que Boost bibliothèque Filesystem aiderait barbante j'ai aucune expérience avec elle (seulement avec d'autres bibliothèques Boost - ceux qui fonctionnait très bien)

Si le binaire est dans le répertoire data utilisation file.t au lieu de data/file.t.

Pour obtenir des chemins portables pour Windows et Linux, vous devrez soit écrire vos propres méthodes pour ajuster les chemins de fichiers ou utiliser de préférence comme bibliothèque boost :: système de fichiers .

Je l'ai utilisé boost :: système de fichiers dans mes projets et je le recommande. Il est facile de créer le chemin, vérifier si le fichier existe, créer des répertoires et ainsi de suite. Peut-être que la courbe d'apprentissage abrupte pour le programmeur débutant c ++, mais les trucs de base comme la création de chemin de fichier devrait être facile.

La seule raison pour laquelle ce chemin relatif fonctionne dans « Windows » est que votre IDE exécute le binaire .. au lieu de data/. Si vous exécutez MSVC vous pouvez être sûr.

Alors, le code de changement

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

puis modifiez le répertoire courant IDE à data/ -> Port complet! :)

Copiez le répertoire / données dans le répertoire bin du projet ou si le binaire est compilé.

chemins relatifs sont les mêmes pour linux et windows (oui exactement le même usage, je les utilise tous les jours dans mon codage de l'application multi-plateforme).

il suffit de cocher CASE, i.e. tous les chemins linux sont sensibles à la casse. ses quelque chose que nous manquons quand on passe de Windows à Linux

Cela signifie que votre répertoire courant lorsque vous exécutez le programme n'est pas réglé à l'endroit où il devrait être (il est probablement à votre répertoire personnel). Essayez d'exécuter le programme comme celui-ci:

cd whatever_dir_is_above_data
./my_prog

EDIT : Oops, vous avez probablement aussi besoin ./ avant que le programme, puisque . est probablement pas dans votre chemin (je l'ai oublié parce que je toujours mettre dans mon chemin, donc je ne dois pas taper).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top