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 :

Parcourir dossier " dirent.h"


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 29
    Points : 30
    Points
    30
    Par défaut Parcourir dossier " dirent.h"
    Bonjour,

    Ce que j'ai actuellement: une fonction qui cherche dans un répertoire des fichiers et me renvoie si le fichier que je cherche se trouve bien dans le répertoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
           DIR *dir;
    struct dirent *ent;
    if ((dir = opendir ("C:\\Users\\to122333\\Desktop\\tableau\\")) != NULL) {
      /* print all the files and directories within directory */
      while ((ent = readdir (dir)) != NULL) {
     
     
    string nomFichier = ent->d_name;
            if(!(nomFichier == ".")&& !(nomFichier == "..")){
                if(CheckSubstring(nomFichier, tableauRechercher ) ){              // tableauRechercher c'est un string (un caractère) que je recherche dans nomFichier
                    cout << "tableau  trouvee " << nomFichier<< endl;
                    break;
                }
     
     
            }
     
      }
      closedir (dir);
    } else {
      /* could not open directory */
      perror ("");
     
    }
    Ce que je veux faire : Au lieu d'écrire cette fonction à chaque fois dans le main ( je l'utilise 4 fois) j'aimerais juste faire appelle à elle + quand le fichier est trouvé dans le répertoire, l'ouvrir.

    Je vous remercie d'avance pour votre aide.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    bah, fait une fonction et appelle-la. C'est pas ca?

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Si c'est ca, mais ca ne veut pas ou plutôt j y arrive pas ( créer la fonction dir) :/ :'(

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Qu'entends-tu par "ca veut pas"?
    Ca ne compile pas?
    Montre nous le code de ton essai (au moins la fonction et celle l'appelant), et la version avant la fonction.

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    C'est juste l'écriture de la fonction hors main qui marche pas. Le reste est bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    DIR* opendir(const char* chemin,string nomTableau)
    {
        DIR *dir
        struct dirent *ent;
    if ((dir = opendir ("C:\\Users\\to122333\\Desktop\\tableau\\")) != NULL) {
      /* print all the files and directories within directory */
      while ((ent = readdir (dir)) != NULL) {
     
     
    string nomFichier = ent->d_name;
            if(!(nomFichier == ".")&& !(nomFichier == "..")){
                if(CheckSubstring(nomFichier, nomTableau ) ){
                    cout << nomFichier<< endl;
                    break;
                }
     
     
            }
     
      }
      closedir (dir);
    } else {
      /* could not open directory */
      perror ("");
     
    }
    }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    - si tu espères retourner quelque chose, faut commencer par avoir une directive return
    - retourner un DIR* implique que l'appelant devra faire le closedir lui-même, pas top
    > tu peux utiliser std::unique_ptr en surchargeant le second template qui est la fonction de libération afin de fournir un objet qui s'auto-détruirait correctement à la fin de sa portée
    - tu fais déjà un closedir dans ta fonction, donc tu retournerais quoi ?
    - dans un tel cas, mettre en place une classe de manipulation de dossier serait préférable imo
    - std::filesystem arrive en C++17 !

    C'est quoi le but de ta fonction ? Juste ouvrir un dossier ? Trouver un fichier à l'intérieur ? Ouvrir le fichier trouvé ? ... ?

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    J'irai chercher boost::file_system, en attendant le C++17.

    Visiblement, tu trouves que c'est bon.
    Un bon compilateur (correctement utilisé) trouverait qu'on sort d'une fonction non void sans return.

    Active les warnings de compilation, et corrige-les.

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Le but de ma fonction: chercher dans le répertoire ---> trouver fichier ---> l ouvrir.
    Je ne suis pas une lumière en programmation .Je débute, donc j'ai pas tout compris dans ce que vous me dites la.
    Le code que j ai écrit la : il cherche dans le répertoire ---> trouve le fichier. Ca marche. Je rajoute la commande ifstream et je pourrais ouvrir le fichier je pense.
    Ce que je souhaite faire, au lieu d'écrire le code en entier à chaque fois dans le main, il serait préférable d'appeler une fonction et c'est la ou je bloque.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4
    Par défaut
    Dans ce cas tu pourrais retourner le chemin du fichier, sous forme de string, que tu pourras utiliser avec std::ifstream. Si elle est vide, le fichier n'a pas été trouvé.

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Depuis C++11, les fstreams sont déplaçables, donc peuvent être retourné par une fonction.

    Comme ifstream dispose d'une fonction is_open(), cela peut te suffire.

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par aminebakr Voir le message
    Le but de ma fonction: chercher dans le répertoire ---> trouver fichier ---> l ouvrir.
    Tu n'as pas l'impression que cela fait beaucoup, ca

    As-tu déjà entendu parler du SRP (pour Single Responsability Principle ou Principe de la responsabilité unique)

    En gros, c'est un principe de conception (tu sais, cette phase dans laquelle on réfléchit avant même d'écrire la première ligne de code) qui nous dit que chaque variable, chaque fonction, chaque type ne doit avoir qu'une seule responsabilité, mais qu'il (ou elle) doit l'assumer correctement.

    Même si on compte le fait de chercher un élément dans un répertoire et celui de trouver l'élément en question comme une seule et unique responsabilité, il reste toujours le fai d'ouvrir le fichier en question, qui représente clairement une autre responsabilité

    Or, selon le SRP, deux responsabilités, cela en fait une de trop pour une fonction.

    Chercher dans un répertoire et renvoyer l'élément trouvé : ok, pas de problème, cela représente une fonction. Ouvrir un fichier, cela représente une autre fonction. Faire les deux dans un ordre bien déterminé (de préférence la première fonction puis la deuxième, vu que c'est l'ordre qui semble le plus logique) c'est le rôle d'une troisième fonction

    De plus, le fichier d'ent-tête issus du C, mais, en plus, c'est un fichier qui n'est pas sensé exister au yeux du C++ (autrement, nous aurions un fichier cdirent, sans extension). Et pour cause : la manière dont les fichiers et les dossiers est totalement dépendante de la plateforme sur laquelle on travaille.

    C'est, entre autres, pour cela que boost a mis au point sa bibliothèque boost::filessystem, qui a servi comme base de travail (comme beaucoup de choses issues de boost) pour la mise au point de std::filesystem en C++17.

    Malheureusement, il faut encore parler de std::experimental::filesystem si on veut être complet. Car il s'agit d'une fonctionnalité qui doit encore être testée sous toutes les coutures avant d'être officiellement acceptée. Si bien qu'il est peut-être plus facile pour toi de passer par l'utilisation de boost

    Ce que je souhaite faire, au lieu d'écrire le code en entier à chaque fois dans le main, il serait préférable d'appeler une fonction et c'est la ou je bloque.
    A vrai dire, il s'agirait d'écrire plusieurs fonctions, chacune s'occupant d'une tâche bien précise. Cela te facilitera énormément la vie, non seulement en te permettant d'avoir des fonctions beaucoup plus courte, et donc, plus faciles à appréhender, mais aussi en te permettant de les tester séparément, et donc de trouver bien plus facilement "d'où vient le bug" lorsqu'il se produira

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Ok, je te remercie pour ton aide et toutes les informations . J'ai réussi à faire ce que je voulais faire.

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

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 20h55

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