IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Utilisation getcwd ()


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut Utilisation getcwd ()
    Bonjour,
    Je suis en train de faire un programme dans lequel j ai besoin de récupérer le chemin d un répertoire via la commande getcwd. Cependant je n'arrive pas à m'en sortir.
    Donc je veux récupérer dans la variable path, le chemin complet de mon fichier fich.

    Situation :

    je suis dans le répertoire "ici" depuis lequel j'exécute mon programme. Je lui donne en paramètre le nom d'un fichier situé dans un sous répertoire "sous" que j'ai ouvert et lu pour recuperer le nom du fichier.

    je veux : chemin.sous.fich

    Prototype de la fonction dans laquelle on travaille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void aff_stat(char *fich);
    Début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void aff_stat(char *fich)
    {
        char *path;
        path = getcwd(fich, 1024);
     
     my_putstr(path); /* affichage du resultat*/  
    }

    Merci beaucoup par avance.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Allo ? Tu utilises un char* et tu n'alloues pas de mémoire ? Allooo ? (Nabila, sors de ce forum !)

    Voir : http://man.developpez.com/man3/getcwd.3.php
    La fonction getcwd() copie le chemin d'accès absolu du répertoire de travail courant dans la chaîne pointée par buf, qui est de longueur size.
    Si le chemin du répertoire en cours nécessite un buffer plus long que size octets, la fonction renvoie NULL, et errno contient le code d'erreur ERANGE. Une application doit détecter cette erreur et allouer un buffer plus grand si besoin est.
    De plus, je crois que tu utilises correctement la fonction getcwd() : elle copie le chemin du répertoire courant dans le buffer passé en paramètre et renvoie ce buffer. Elle n'analyse pas ce que contient la chaîne passée en paramètre, c'est un paramètre dit de sortie.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Merci mais le man je l'ai déjà vu ^^

    Je récupère très bien le chemin absolu.
    le problème devient surtout la concaténation après, parce que getcwd va récupérer le chemin absolu du répertoire d exécution. Il faut donc que je concatène derrière la suite du chemin jusqu'au fichier.

    J'ai tenté avec strcat, mais ça segfault.
    J'ai tenté du realloc, mais toujours une erreur avec realloc.
    Sachant que je dois compiler avec gcc et tous les flages : -W -Wall -Werror -pedantic -ansi

  4. #4
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 893
    Par défaut
    C'est quasiment sûr que ton buffer n'est pas assez grand ou alors qu'il manque un '\0' quelque part parce que ce que tu veux faire est relativement simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strcat(path, "/");
    strcat(path, filename);
    PS : l'option -W est inutile si -Wall est mise vue que la deuxième inclue la première (source : man gcc).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Bonjour,

    Merci pour vos réponses, j'ai finis par trouvé.
    Et j'ai aussi réalisé que la fonction getcwd n'était pas du tout optimisé pour ma situation et qu'il m'était en faite bien inutile.

    Et oui en effet Imperio, j'attribuais aussi une mauvaise taille au buf.

    Merci à tous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ......
    char* chemin;
    chemin =  malloc( (my_l(content) + my_l(path)) * sizeof(char) + 1);
     
    chemin = my_strcat(chemin, path);
    if (chemin[my_l(path) - 1] != '/')
         chemin = my_strcat(chemin, "/");
    chemin = my_strcat(chemin, content);
    ........
    my_l => longueur de la chaine
    my_strcat => strcat

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 502
    Billets dans le blog
    1
    Par défaut
    Merci mais le man je l'ai déjà vu ^^
    Voir c'est bien, lire c'est mieux

  7. #7
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Aaah... ça sent le code Epi* les my_ et tous ces flags...

    Bref, dans ton malloc tu as mal formaté là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    malloc( (my_l(content) + my_l(path)) * sizeof(char) + 1);
    Ton dernier caractère est lui aussi un caractère !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    malloc( (my_l(content) + my_l(path) + 1) * sizeof(char));
    Et si jamais tu développes en C/Windows avec différents encodages, ça te permettra de ne pas segfaulter !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo