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 :

Tableau de chaînes de caractères


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Par défaut Tableau de chaînes de caractères
    [EDIT] fork de cette discussion[/EDIT]

    Bonjour.

    Je préfère continuer ici que de créer mon propre topic, les sujets étant similaires.
    Je souhaite moi aussi lister les fichiers d'un répertoire, puis leur appliquer un traitement particulier.

    Mon idée d'organisation est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // je liste les noms des fichiers à traiter dans un tableau 
    char *tab_list_files[256];
     
    //je fais une boucle qui va traiter tous les fichiers
    While(tab_list_files[i]!=NULL)
    {
        current_file = tab_list_files;
        traitement();
        i++
    }
    1 - Est ce que c'est une bonne organisation?


    2 - J'ai un problème technique dans mon code qui est le suivant:

    - je liste les fichiers d'un répertoire
    - si le nom de fichier commence par "debut", je l'affiche et je le stock dans mon tableau
    -> OK
    - mais une fois le listing terminé, quand je veux réutiliser les noms de mes fichiers séléctionnés, ils ont tous pris le nom du dernier fichier lu dans le répertoire... HELP !!!

    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
     
    char *tab_list_files[256];
    int i;
     
    int main()
    {
     
        struct dirent *lecture;
        DIR *rep;
        rep = opendir("." );
     
        i=0;
     
        while ((lecture = readdir(rep))) {                  // on lit tous les fichiers du répertoire local
     
            if(!strncmp(lecture->d_name,"debut",5))       // si les 5 premières lettres du nom de fichier = "début"
            {
                tab_list_files[i] = lecture->d_name;        // alors on enregistre ce nom de fichier dans le tableau tab_list_files
                printf("%s\n", tab_list_files[i]);          // T1 au passage on l'affiche
                i++;                                        
            }
     
        }
        closedir(rep);
     
        i=0;
        while(tab_list_files[i]!=NULL)                      // on va afficher toutes les noms de fichiers stoquées qui ne sont pas vides
        {
            printf("\n+1 %s\n",tab_list_files[i]);           // T2 on réaffiche les noms des fichiers commençant par "début" -> cela ne marche pas
            i++;
        }
     
     
        getch();
        return 1;
    }
    Je tourne en rond, je ne comprend pas pourquoi mes variables qui ont à l'intstant T1 le bon nom de fichier prennent en T2 le nom du dernier fichier du répertoire lu...

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Toutes tes lignes de tableau sont des pointeurs sur chaîne qui prennent la valeur de lecture->d_name. Je soupçonne que le struct est simplement réutilisé et mis à jour quand tu pointes sur le fichier suivant...ce qui fait que toutes tes lignes pointent sur la même chaine de caractère...qui ne peut pas avoir plusieurs valeurs à la fois. C'est pour ça que tu te retrouves avec n fois le même nom de fichier.

    Pourquoi n'utilises-tu pas un vector de std::string? Il est possible de recopier une chaine "C-style" dans une string, là c'est une copie et tu n'auras pas de prise de tête.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Par défaut
    Ce que je ne comprend pas c'est que quand je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tab_list_files[i] = lecture->d_name;
    tab_list_files[i] prend la valeur de lecture->d_name à l'instant T.

    Même si lecture->d_name change par la suite, je ne comprend pas à quel moment tab_list_files[i] est impacté.


    Je préférerais réussir à résoudre mon problème sans passer par un vector std::string, j'ai énormément de mal avec le C++... en fait j'ai posté ici avant tout parce que le sujet était le même que celui que j'allais ouvrir dans la partie C.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    tab_list_files[i] prend la valeur de lecture->d_name à l'instant T.

    Même si lecture->d_name change par la suite, je ne comprend pas à quel moment tab_list_files[i] est impacté.
    Parce qu'il s'agit d'un pointeur. Le contenu n'est pas dans tab_list_files[i] mais dans lecture->d_name, que le tableau se contente de pointer. Donc toutes les chaines ont la même valeur, celle de lecture->d_name. D'ailleurs le tableau peut donner lieu à des bugs mémoire (segfault, changements incompréhensibles) s'il est utilisé après libération du struct lecture.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    En C++, les chaînes de caractères, c'est std::string, les tableaux, c'est std::vector et les E/S c'est les flux std::cout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::vector<std::string> tab_list_files;
     
    //je fais une boucle qui va traiter tous les fichiers
    for(std::vector<std::string>::iterator it = tab_list_files.begin();it!=tab_list_files.end();++it)
    {
        std::string current_file = *it;
        traitement();
    }
    etc...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 54
    Par défaut
    Ok, la solution en C++ est de repartir avec une autre nature de variable.

    Merci.

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

Discussions similaires

  1. Tableau de chaînes de caractères
    Par inh40 dans le forum C++
    Réponses: 15
    Dernier message: 15/04/2008, 17h56
  2. Réponses: 13
    Dernier message: 18/07/2007, 09h01
  3. Tableau de chaînes de caractères
    Par sone47 dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/02/2007, 14h54
  4. tableau de chaîne de caractères
    Par salseropom dans le forum C
    Réponses: 6
    Dernier message: 11/09/2006, 17h23
  5. Tableau de chaînes de caractères
    Par mac1 dans le forum Langage
    Réponses: 3
    Dernier message: 15/01/2006, 13h18

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