2008-12-10 7 views
1

Je développe un prototype pour un jeu, et certaines règles de jeu doivent être définies dans un fichier ini afin que les concepteurs de jeux puissent modifier les paramètres du jeu sans avoir besoin de l'aide de moi en plus d'une re-compilation. C'est ce que je fais actuellement:std :: ifstream :: open() ne fonctionne pas

std::ifstream stream; 
stream.open("rules.ini"); 

if (!stream.is_open()) 
{ 
    throw new std::exception("Rule file could not be opened"); 
} 

// read file contents here 

stream.close(); 

Cependant, mon flux n'ouvre jamais avec succès. Plonger profondément dans la source de la STL pendant le débogage révèle que _getstream() (tel que défini dans stream.c) continue de retourner la valeur NULL, mais je n'arrive pas à comprendre pourquoi. Aide, quelqu'un? Editer: Rules.ini se trouve dans le même répertoire que le fichier .exe.

+0

est le nom du fichier ou rules.ini rules.ini? – Whaledawg

Répondre

7

Vous supposez que le répertoire de travail est le répertoire dans lequel se trouve votre exécutable. C'est une mauvaise hypothèse. Votre fichier exécutable peut être exécuté à partir de n'importe quel répertoire de travail, c'est donc une mauvaise idée de coder en dur les chemins relatifs dans votre logiciel.

Si vous voulez pouvoir accéder aux fichiers relatifs à l'emplacement de votre exécutable, vous devez d'abord déterminer le chemin de votre exécutable et créer un chemin complet à partir de celui-ci.

Vous pouvez obtenir le nom de votre exécutable en examinant le paramètre argv[0] transmis à main(). Alternativement, si vous êtes sur Windows, vous pouvez l'obtenir avec GetModuleFileName() en passant NULL comme premier paramètre.

2

La portée de votre flux ouvert est correcte. "Rules.ini" n'est pas un chemin complet, il doit donc être relatif, alors de quoi s'agit-il? Ou avez-vous besoin d'utiliser le chemin complet là-bas.

+0

Désolé, j'ai oublié de mentionner, le fichier est dans le même répertoire que mon fichier .exe. Cela devrait fonctionner avec les paramètres par défaut, je pense? – Aistina

+0

Aistina, no. Cela dépend du répertoire de travail actuel. Si votre application a été exécutée en utilisant ../a.out, par exemple, elle échouerait –

0

(hypothèse sauvage ici) vous utilisez visual studio. Pendant le débogage, votre programme va rechercher dans le répertoire du projet "rules.ini"

Cependant, si vous essayez d'exécuter votre programme à partir de "myproject/debug/myexe.exe", il devrait fonctionner correctement car il va recherche «/debug » pour rules.ini

Comme son été commenté, vous devez spécifier le chemin complet, car le chemin relatif ont tendance à conduire à des erreurs

+0

Non, ne pas coder en dur les chemins absolus dans les exécutables s'il vous plaît. –