Après avoir passé un peu de temps sur ce problème vraiment très bête, j’aimerais faire une note rapide dessus.
Les fichiers et Visual Studio
Aujourd’hui, je programme en C++ avec l’IDE Visual Studio.
Pas plus tard que tout à l’heure, je teste un programme qui fait des entrées/sorties (ou I/O) basiques sur un fichier texte.
Le programme pourrait se résumer à :
1 2 3 4 |
int main() { std::ofstream ofs("test.txt"); ofs << "lorem ipsum"; } |
Puis, au moment de déboguer le programme pour vérifier que tout fonctionne bien, stupeur et tremblements… Je ne trouve pas de fichier test.txt à côté de l’exécutable compilé !
N’en croyant pas mes yeux, j’ouvre alors l’explorateur de fichiers pour aller lancer l’exécutable à la main… Et là re-stupeur et tremblements, le fichier se crée bien à côté de l’exécutable !
Il y a décidément anguille sous roche… Autrement dit, le fichier semble ne pas se créer lorsqu’on lance l’exécutable depuis le débogueur de Visual Studio.
J’ajoute donc un peu de code pour vérifier que tout se passe bien :
1 2 3 4 5 6 7 |
int main() { std::ofstream ofs("test.txt"); if (ofs.is_open()) { ofs << "yep"; } } |
Sans trop de stupeur et tremblements cette fois, je constate que le fichier est bien ouvert. Il ne s’agit donc pas d’un problème quelconque avec la création du fichier.
LA question devient alors: si le fichier est effectivement ouvert, où donc l’est-il ?
Ce n’est qu’en parcourant Stack Overflow que j’ai trouvé un début de réponse.
Sous Windows, en incluant le header <direct.h>, il devient alors possible d’utiliser la fonction :
1 |
std::string cwd = getcwd( NULL, 0 ); |
Et d’inspecter la valeur de cwd afin de savoir ce que l’exécutable, lorsque lancé dans le débogueur de Visual, considère comme son « dossier courant » dans lequel le fichier est vraisemblablement créé…
Et là, stupeur et tremblements !
J’avais complètement oublié qu’un projet Visual Studio se configure pour considérer par défaut le dossier du fichier projet Visual Studio (le .vcxproj) comme le dossier courant de l’exécutable lancé dans le débogueur.
C’est donc avec stupeur (et tremblements) que je m’aperçus que le chemin du dossier renvoyé par la fonction getcwd correspondait en fait à l’emplacement du fichier vcxproj !
En effet, je suis dans une configuration où les fichiers binaires exécutables générés à la compilation sont proprement séparés des fichiers Visual Studio dans un dossier à part. Dit autrement, je regardais au mauvais endroit depuis le début !
En retestant en me plaçant dans le dossier des fichiers Visual Studio, j’ai pu confirmer mon hypothèse. Cela explique donc bien tout :
- Lancé depuis l’explorateur, l’exécutable prend comme dossier courant le « vrai » dossier courant, et donc génère des fichiers dans le même dossier que lui
- dans le débogueur Visual Studio, la configuration est telle que les fichiers générés sont générés au niveau des fichiers Visual Studio, qui bien souvent ne sont pas au même endroit ; un comportement personnalisable en allant fouiller dans les menus, avec un VS en anglais, avec: clic droit sur le projet, Properties, onglet Debugging puis ligne « Working Directory ».
Et voilà, « mystère » (qui n’en est pas un parce que quand même ça relève un peu du fonctionnement de base de Visual Studio mais curieusement je n’arrive pas à m’en rappeler) élucidé !