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 :

Problème pour lire les titres d'un dossier


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut Problème pour lire les titres d'un dossier
    bonjour a tous,
    voici mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include<iostream>
    #include<stdio.h>
     
    using namespace std;
     
    int main(){
    FILE*dossier=NULL;
    char chaine[100];
    dossier=fopen("C:\\Users\\User\ \Desktop\\programme","r");
    while(!feof(dossier)){
    fgets(chaine,100,dossier);
    cout<<chaine<<endl;}}
    j'aimerais qu'il me lise les noms des dossiers se trouvant dans le dossier programme mais il bug a chaque fois,
    peut etre que fgets ne peut lire que les fichiers txt ou php .
    si vous savez comment faire je suis tout ouie
    merci d'avance

  2. #2
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Points : 261
    Points
    261
    Par défaut
    Bonjour,


    fopen sert uniquement à ouvrir un fichier, pour effectuer ce que vous souhaitez faire il faut passer soit par l'API du systéme adjacent (ici API WIN32), ou alors utiliser l'api POSIX qui est portable.

    Pour l'API POSIX, il faut include :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <sys/types.h>
    #include <dirent.h>
    puis utiliser la fonction opendir

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut reponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include<iostream>
    #include<stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
     
    using namespace std;
     
    int main(){
       DIR*dossier=NULL;
       char chaine[100];
       dossier=opendir("C:\\Users\\pac\\Desktop\\programme","r");
       while(!feof(dossier)){
       readdir(chaine,100,dossier);
       cout<<chaine<<endl;}}
    j'ai testé ça c'est faux tu peux me guider un peu car je débute et je galère pas mal

  4. #4
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Points : 261
    Points
    261
    Par défaut
    j'ai testé un bout de code qui fonctionne trés bien sous ma Debian, normalement vu que c'est du POSIX sa devrait marcher sans probléme sous Windows, pour éviter d'afficher le repertoire courant "." et parent ".." rajoute une condition au moment de l'affichage pour les squizzer.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #include<iostream>
    #include<stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <string.h>
     
    using namespace std;
     
     
    int isDir(struct dirent* rep)
    {
        if ((strchr(rep->d_name, '.')) == NULL ||
             strcmp(rep->d_name, "..") == NULL ||
             strcmp(rep->d_name, ".") == NULL)
     /* Si le nom du fichier n'a pas de point (une extension)
        sauf pour "." et ".." */
            return 1;
        else
            return 0;
    }
     
    int main(){
     
       DIR* dossier=NULL;
       struct dirent *direntp = NULL;
       char chaine[100];
       dossier=opendir("C:\\Users\\pac\\Desktop\\programme");
    if (dossier != NULL)
    {
        while ((direntp = readdir(dossier)) != NULL)
        {
     
            //Verifiction de s'il sagit d'un dossier
            if (isDir(direntp))
            {
                 //Affichage du dossier 
                cout << direntp->d_name << endl;
            }
         }
    }
     
    }

  5. #5
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Si tu veux utiliser l'API Win32, Voici un exemple :

    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
     
    #include <stdio.h>
    #include <windows.h>
    int main()
    {
        WIN32_FIND_DATA wfd;
        HANDLE hf = FindFirstFile("D:\\Programmes\\*.*", &wfd);
        if(hf!=INVALID_HANDLE_VALUE)
         {
           do
            {
               if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
                                                      printf("%s\n", wfd.cFileName);
            }
           while(FindNextFile(hf, &wfd));
           FindClose(hf);
         }
        else
         {
           puts("Echec de lecture du dossier !");
         }
        return 0;
    }
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut dernière petite chose
    merci beaucoup Ethan 0x21 ton exemple était parfait , il me reste une toute petite question voila le code :

    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
    #include<iostream>
    #include<stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <string.h>
     
    using namespace std;
     
     
    int main(){
     
       DIR* dossier=NULL;
       struct dirent *direntp = NULL;
       dossier=opendir("C:\\Users\\pac\\Desktop\\programme");
    if (dossier)
    {
        while ((direntp = readdir(dossier)) != NULL)
        {
     
       if(direntp->d_name=="_COURS"){cout<<"le dossier _COURS existe"<<endl;}
     
     
    	}}}
    voila j'aimerais qu'il me dise que le dossier _COURS existe mais ça ne marche pas ce que j'ai mis je pense que tu as la solution

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hia,

    Le champ d_name n'est pas une string C++, mais une bonne vieille chaîne C : char *.

    Il faut quand même regarder la définition des structures que tu utilises avant de t'étonner que ça ne fonctionne pas.
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    dsl droggo je debute et j'ai pas compris ta reponse , je connais le char et le string mais je ne comprend pas pourquoi ca pose probleme dans ma condition
    peux tu me donner un exemple sur ma reponse je comprend mieux comme ca , ca serait sympa

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    Citation Envoyé par cosmoff Voir le message
    Je connais le char et le string mais je ne comprend pas pourquoi ca pose probleme dans ma condition
    peux tu me donner un exemple sur ma reponse je comprend mieux comme ca , ca serait sympa
    Tu ne peux pas comparer deux chaînes de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(direntp->d_name=="_COURS")
    Quand tu fais cela, tu compares en fait leur adresses respectives en mémoire, et pas leur contenu. À la place, il faut utiliser strcmp() (String Compare), qui va parcourir les deux chaînes en parallèle et te renvoyer un nombre négatif, nul ou positif selon que la première chaîne soit inférieure, identique ou supérieure à la seconde.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <string.h>
     
    if(!strcmp(direntp->d_name,"_COURS"))

  10. #10
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 562
    Points
    1 562
    Par défaut
    Attention!

    Citation Envoyé par Ethan 0x21 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int isDir(struct dirent* rep)
    {
        if ((strchr(rep->d_name, '.')) == NULL ||
             strcmp(rep->d_name, "..") == NULL ||
             strcmp(rep->d_name, ".") == NULL)
     /* Si le nom du fichier n'a pas de point (une extension)
        sauf pour "." et ".." */
            return 1;
        else
            return 0;
    }
    Les répertoires (en tout cas sous windows) peuvent avoir une extension! Créer (via un clic droit -> nouveau -> dossier) ou sous console (msdos) un répertoire appelé b.b ne pose aucun problème....
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut merci
    parfait ca marche merci infiniment de votre aide c'est super sympa

  12. #12
    Membre éclairé
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Attention!
    Les répertoires (en tout cas sous windows) peuvent avoir une extension! Créer (via un clic droit -> nouveau -> dossier) ou sous console (msdos) un répertoire appelé b.b ne pose aucun problème....
    Sous Linux aussi (et même sans parler d’extension, les noms de dossiers peuvent contenir des points)…
    Le plus sûr et le plus portable, pour peu que Windows implémente la fonction stat de POSIX (ce qui demande vérification), serait de faire un stat puis d’utiliser la macro S_ISDIR sur le champ st_mode.

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par grim7reaper Voir le message
    Le plus sûr et le plus portable, pour peu que Windows implémente la fonction stat de POSIX (ce qui demande vérification), serait de faire un stat puis d’utiliser la macro S_ISDIR sur le champ st_mode.
    Ce n'est pas Windows qui l'implémente mais la librairie C de ton environnement de développement.

    Cette librairie appellera alors la fonction native de Windows.

    Mais oui, la plupart des librairies C que j'ai vues (toutes ?) implémentent stat().
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

Discussions similaires

  1. [JDOM] Problème pour lire les noeuds avec JDOM
    Par Eclix dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 26/05/2014, 18h11
  2. Problème pour lire les donnée d'une table externe
    Par waldoun dans le forum SQL*Loader
    Réponses: 0
    Dernier message: 01/05/2009, 18h16
  3. Problème pour lire les donnée d'une table externe
    Par mardoch dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 17/07/2008, 16h41
  4. Problème pour lire les flux rss en flex
    Par gannher dans le forum Flex
    Réponses: 6
    Dernier message: 18/07/2007, 16h24
  5. Réponses: 2
    Dernier message: 07/11/2006, 22h42

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