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

SL & STL C++ Discussion :

récuperer une variable Vector remplie de noms de fichiers...


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut récuperer une variable Vector remplie de noms de fichiers...
    Salut tous , je voudrais bien savoir comment remplir un tableau Vector avec des noms de fichiers dans le répertoire courant et dans les sous dossiers , et sous-sous dosssiers etc...

    J'utilise Dev-C++ avec le compilateur MingW ( portage de GNU C sous Windows ) .

    Merci pour toute réponse .

    PS : le truc doit aussi fonctionner sous d'autres systémes ayant le compilateur GNU .

    @+ Bouazza

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Cherche du côté de boost (http://www.boost.org/), ils ont une librarie sur les systèmes de fichier très pratique (http://www.boost.org/libs/filesystem/doc/index.htm)

    A bientôt

    Aurélien

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Merci mais n'y a-t-il pas une autre solution sans utiliser des librairies externes ?

    Merci pour toute réponse .

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ben pourquoi tu ne veux pas utiliser de librairie externe?

    Enfin bref, si, c'est possible, mais je pense que ça doit être fastidieux sans librairie.
    Toujours utile que boost sait le faire, et c'est opensource... Télécharge le et regarde comment ils font, et fait pareil.

    A bientôt

    Aurélien

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Peux quelqu'un me donner un bout de code qui extrait les fichiers du dossier courant et des sous-dossiers , et des sous-sous dossiers etc... , tout en utilisant la librairie standard de C++ et sans librairie externe ( je prévoie un programme qui doit etre portable et compatible avec toutes les plate-formes ayant un compilateur C++ ) .

    Merci pour toute réponse .

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Il n'y a rien de standard en C++ pour faire ce genre de choses.

    boost::filesystem, bien que non standard, a l'avantage d'être portable sur plein de plate-formes.

    De plus, une proposition a été faite de l'introduire dans la prochaine version de la norme C++.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oui voilà, je suis pas sûr mais je pense que ce genre de traitement fait appel au système d'exploitation... donc si c'est bien ça, faut tous les connaître pour avoir quelque chose de portable.

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Merci , mais comme j'ai dit , je ne veux pas une librairie externe .

    je vais essayer de faire des boucles pour explorer les répertoires pour les fichiers et de finir lorsque le dernier fichier a été trouvé .

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Encore une fois, ce n'est pas possible.

    Tu peux faire toutes les boucles que tu veux, tu ne peux pas explorer les répertoires en C++ standard. Il n'y au aucune fonction qui permette de faire ça.

    La seule chose existant en C++ standard, c'est un moyen à partir d'un nom de fichier (au format non standardisé), d'ouvrir un flux dessus, ou bien de supprimer ce fichier. Rien d'autre n'existe, et tu conviendras que ces deux fonctions sont insuffisantes pour explorer quoi que ce soit.

    Maintenant, pourquoi ce refus de bibliothèque externe ? Tu a indiqué la portabilité, mais ce n'est pas un problème avec boost::filesystem. Alors, quoi ?

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ben je pense qu'il ne veut pas à avoir à recompiler la moindre librarie pour l'exporter sous un autre OS (surement pour ne pas compliquer cette tache en devant aller chercher à droite à gauche les librarie et s'embêter à les recompiler)

    Mais bon sans librarie, soit tu passe des années à refaire ce qui existe, soit tu fais pas grand chose...

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    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
     
    void listfiles(const char *WhereBegin)
     {
      struct _finddata_t D;
      int done=0;
      int hd;
      _chdir(WhereBegin);
      hd = _findfirst("*.*",&D);
      while (!done) 
      {
    	if (D.name[0]!='.')
    	{
    		if (D.attrib&0x10)
    		{
    			_chdir(D.name);
    			listfiles();
    			_chdir("..");
    		}
    		else	{
                 std::cout << D.name << std::endl;
           }
    	}
        done = _findnext(hd,&D);
    }
    }
    En fait ce code fait ce que je veux , mais comment faire pour qu'il retourne un vecteur contenant les noms de fichiers ( D.name ) ?

    Merci pour toute réponse.[/code]

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    ben tu déclare un vector de const char*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<const char*> fileVector;
    et ensuite lorsque tu veux l'ajouter tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fileVector.push_back(D.name);
    A bientôt

    Aurélien

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par bouazza92
    Merci , mais comme j'ai dit , je ne veux pas une librairie externe
    Sauf que tu n'as pas le choix. Il n'y a rien dans le standard. Tu es obligé d'utiliser une bilbiothèque extene au langage. Même si elle est propre à ton SE.

  14. #14
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Voici ce que j'ai fait mais ça ne marche pas :
    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
     
    std::vector<const char*> listfiles(const char *WhereBegin)
     {
      std::vector<const char*> fileVector;
      struct _finddata_t D;
      int done=0;
      int hd;
      _chdir(WhereBegin);
      hd = _findfirst("*.*",&D);
      while (!done)
      {
       if (D.name[0]!='.')
       {
          if (D.attrib&0x10)
          {
             _chdir(D.name);
             listfiles(D.name);
             _chdir("..");
          }
          else   {
                 fileVector.push_back(D.name);
           }
       }
        done = _findnext(hd,&D);
    }
    return(fileVector);
    }
    Merci d'avance

  15. #15
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    ça se compile mais ça me donne des signes bizarres !

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    c'est quoi les erreurs?

  17. #17
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Il n'y a pas d'erreur , le programme se compile , mais quand on l'execute , il écrit des caractéres bizarres au lieu d'écrire les noms des fichiers !

  18. #18
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Amusant, tu dis ne pas vouloir utiliser de bibliothèques externes, à des fins entre autre de portabilité, mais en fait, tu utilises une bibliothèque externe, non portable en plus.

    Les _chdir, _findfirst... n'ont rien de standard, et sont spécifiques à un windows. Tu peux donc oublier tous rêves de compatibilité tant que tu te bases sur ça pour parcourir tes répertoires...

    A part ça, les problèmes que tu as viennent probablement de la gestion de chaînes de caractère en char* au lieu de std::string... Quand tu fais un push_back de D.name, tu copie un pointeur dans ton vecteur, or ce pointeur va pointer sur autre chose à l'itération suivante de ta boucle, et ne plus pointer sur rien quand tu sortira de cette boucle. La plus simple pour corriger ce code est probablement d'utiliser un vector<std::string> qui se chargera de gérer corectement la copie de chaînes de caractères.

    Mais je te rapelles que tu n'as pas le choix, que tu es obligé de passer par une bibliothèque externe, et que tant qu'à faire, autant passer par une bibliothèque portable, comme boost::filesystem, si tu recherches la portabilité.

    PS : Boost::filesystem ne gère pas encore les noms de fichier internationalisés, (elle doit le faire dans sa prochaine version), ce qui peut être un inconvénient par rapport à la bibliothèque windows que tu utilises, mais bon, de toute façon, tu n'utilises pas non plus cette bibliothèque de façon à obtenir des noms internationnalisés.

  19. #19
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Les bibliothéques que j'utilise sont io.h et stdio.h et elles sont disponible sous linux et windows ( avec tous les compilateurs C++ ).
    et merci pour ta réponse , je vais essayer std::vector<std::string> .

  20. #20
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    J'en doute fort. http://dinkumware.com/manuals/reader.aspx?lib=cpp.
    Autre preuve le tiret bas qui préfixe les noms de fonctions. Le préfixage par tiret bas est résevé aux extensions propriétaires, et autres détails d'implémentation propres à tel ou tel autre compilateur.

Discussions similaires

  1. [AJAX] Fancy Upload - récuperer une variable nom
    Par menekis dans le forum AJAX
    Réponses: 0
    Dernier message: 15/11/2009, 17h00
  2. Récuperer la valeur d'une variable à partir de son nom
    Par Etanne dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/10/2007, 18h04
  3. [Tableaux] récuperer une variable tableau passé par URL
    Par molesqualeux dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2005, 01h12
  4. [PHP-JS] Récuperer une variable javascript..
    Par gwendy dans le forum Langage
    Réponses: 3
    Dernier message: 17/10/2005, 21h24
  5. Récupérer une variable à partir de son nom ...
    Par CynO dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/10/2005, 16h59

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