URL: https://linuxfr.org/forums/programmation-c--2/posts/c-gestion-du-repertoire-de-travail Title: C : gestion du répertoire de travail Authors: harlock974 Date: 2023年03月15日T12:39:46+01:00 License: CC By-SA Tags: c, répertoire et langage_c Score: 0 Bonjour à tous, Je recherche le moyen le plus simple (au sens "moins de lignes de code") de récupérer le répertoire de travail d'un programme. Supposons que le programme ait besoin d'ouvrir un fichier data.txt situé dans le même répertoire que l'exécutable. Le plus simple est d'écrire : `f=fopen("data.txt","r");` Mais si j'appelle le programme d'un autre emplacement que celui de l'exécutable, ça ne marche pas. Il faut donc récupérer le répertoire de travail. Voici les deux méthodes les plus simples que j'ai trouvées : ### Méthode 1 : ```C #define _GNU_SOURCE #include #include #include #include int main(int argc, char *argv[]) { FILE *f; char *racine; char *chemin; char nom_fichier[]="/data.txt"; racine=strdupa(argv[0]); chemin=malloc(strlen(dirname(racine))+strlen(nom_fichier)+1); strcpy(chemin,racine); strcat(chemin,nom_fichier); if ((f=fopen(chemin,"r")) != NULL) { ... ``` Si l'on veut se passer de l'extension GNU, on peut remplacer `racine=strdupa(argv[0]);` par : ```C racine=malloc(strlen(argv[0])+1); strcpy(racine,argv[0]); ``` Bien sûr ceci a peu d'intérêt étant donné le caractère anecdotique des systèmes d'exploitations autres que GNU-Linux. ### Méthode 2 : ```C #define _GNU_SOURCE #include #include #include #include int main(int argc, char *argv[]) { FILE *f; int l; char *chemin; char nom_fichier[]="data.txt"; l=strlen(argv[0])-strlen(program_invocation_short_name); chemin=malloc(l+strlen(nom_fichier)+1); memcpy(chemin,argv[0],l); strcat(chemin,nom_fichier); if ((f=fopen(chemin,"r")) != NULL) { ... ``` On peut simplifier encore plus en se passant des malloc en assignant une dimension fixe aux chaînes, mais c'est moins propre. Et vous comment faites vous ?

AltStyle によって変換されたページ (->オリジナル) /