Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
867 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [c] enregistrement des noms des fichiers dans un tableau

 



 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[c] enregistrement des noms des fichiers dans un tableau

n°735638
lordankou
Posté le 24-05-2004 à 10:20:57  profilanswer
 

bon voila j'ai le code suivant (explication en dessous du code)
 

Code :
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <dirent.h>
  6. // ----------------------------
  7. // Corps du programme principal
  8. // ----------------------------
  9. int main (int argc, char *argv[ ]) {
  10.     int NombreLigne = 100 ; // nombre de fichier max dans le tableau
  11.     int NombreColone = 64 ; // longueur max d'un nom de fichier
  12.     char **NomTabFichier; // tableau contenant le nom des fichiers  
  13.    
  14.     int i ; // variable temporaire
  15.    // Recuperation des fichier mtv
  16.    // on va récupérer la liste des ficheir mtv
  17.    ParcoursFichier(NombreLigne,NombreColone,&NomTabFichier);
  18.    // libération de l'espace mémoire
  19.    free(NomTabFichier);
  20.  
  21.    // fin normale du programme
  22.    return 0;
  23.      
  24. }   
  25.    
  26.    
  27. // parcours repertoire
  28. // cette fonction va parcourir le répertoire test et récup tous les fichiers mtv
  29. int ParcoursFichier(int NombreLigne, int NombreColone,char*** TabFichier){
  30.     // declaration des variables
  31.     DIR * repertoire ; // definition d'une variable de type Repertoire
  32.     char * NomRep = "TEST" ; // Nom du répertoire test
  33.     struct dirent *entree ; //une entree du repertoire  
  34.     char * separateur = ".mtv" ; // type de fichier recherché
  35.    
  36.     char *p ; // variable temporaire
  37.     int i = 0; // variable temporaire
  38.     // allocation de la mémoire pour la variable NomTabFichier
  39.     *TabFichier = (char **) malloc(NombreLigne * sizeof(char *)); // char ** pour la conversion du pointeur renvoyé par malloc
  40.     //vérification de l'allocation  
  41.     if (TabFichier == NULL)
  42.     { 
  43.         printf ("l'allocationde la mémoire a échoué. Fin du programme \n" ) ; 
  44.         exit (0) ;                         
  45.     }
  46.     //ouverture du répertoire
  47.     repertoire = opendir(NomRep);
  48.     // parcours du répertoire
  49.     while((entree=readdir(repertoire))!=NULL)
  50.     {
  51.         // on verifie si elle contient la sous chaine ".mtv"
  52.         p = strstr(entree->d_name,separateur);
  53.         if (p!=NULL)
  54.         {         
  55.        
  56.           // allocation de l'espace memoire       
  57.           (*TabFichier)[i] = (char *)malloc(sizeof(entree->d_name));
  58.          
  59.           // copie du nom du répertoire
  60.           strcpy((*TabFichier)[i],entree->d_name);
  61.        
  62.           // on incremente la variable i  
  63.           i++ ;
  64.          
  65.         } 
  66.     }
  67.    
  68.     // on ferme le répertoire
  69.     closedir(repertoire);
  70. }


 
Voila je voudrais lister tous les noms de fichiers qui ont l'extension .mtv
Pour cela je veux les stocker dans un tableau afin de pouvoir les réutiliser plus tard (j'ai extrait le morceau de code ci dessus afin de régler en premier lieu ce problème de listage de fichier).
Lors de l'exécution il plante (pourtant il passe 3 fois dans la boucle --> il y a bien 3 fichiers dans le sous répertoire).
Je m'interroge donc sur ce plantage bien que j'ai de grosses lacunes au niveau pointeur (mais bon on va dire que la formation DUT info n'est pas top à ce niveau...).
Si quelqu'un a des idées je suis preneur.
 
N.B : je travail sous windows avec dev-c++


Message édité par lordankou le 26-05-2004 à 09:43:19

---------------

mood
Publicité
Posté le 24-05-2004 à 10:20:57  profilanswer
 

n°735644
Taz
bisounours-codeur
Posté le 24-05-2004 à 10:22:35  profilanswer
 

et les allocations mémoires ?

n°735693
lordankou
Posté le 24-05-2004 à 10:46:35  profilanswer
 

oui en effet je l'ai oublié. mais justement je pense que mon problème vient en partie du fait que je n'arrive pas à visualiser vraiment ce que je dois programmer pour garder en mémoire mon tableau de nom de fichier.
pour l'allocation mémoire j'ai mis :  
NomTabFichier = (char *)malloc (NbrFichier * sizeof (char)) ;  
or bien sur ça n'est pas correct.  
je pense que le problème vient de la déclaration de mon tableau.
si j'ai bien compris j'ai déclaré un tableau de chaîne de caractère.
et je souhaite donc remplir chaque élément de ce tableau qui seront identifié par NomTabFichier[i] (c'est ça ?).
je sèche totallement sur le coup et je voudrais bien un peu d'aide.


---------------

n°735744
Taz
bisounours-codeur
Posté le 24-05-2004 à 11:16:39  profilanswer
 

avant de faire des strcpy quelque part, assure toi que la zone de destination est allouée et correctemet dimensionnée

n°735777
lordankou
Posté le 24-05-2004 à 11:34:22  profilanswer
 

j'ai édité le message pour mettre le code à jour. le problème est donc la déclaration de mon tableau.  
est ce que je déclarre bien un tableau de chaine de caractere ?  
parce que le malloc m'envoit boulet en me disant "incompatible types in assignment" ce qui tendrait donc à dire que c'est bien un tableau que j'ai déclaré. mais dans ce cas comment libérer de l'espace mémoire pour ce dernier ?


---------------

n°735792
Taz
bisounours-codeur
Posté le 24-05-2004 à 11:39:57  profilanswer
 

ton malloc est pas bon, et il manque toujours des allocations dans ta fonction

n°735836
lordankou
Posté le 24-05-2004 à 11:50:11  profilanswer
 

bah disons qu'avant de m'attaquer au reste je voudrais bien comprendre le début (c vraiment ça qui me bloque ensuite je trouverai par moi même je pense).
le problème de mon malloc c que là j'attribue la longueur pour une ligne du tableau (il faudrait d'ailleur que je change le nom de la variable c trompeur) mais pas pour tout le tableau (en même temps je voudrais faire quelque chose de dynamique).  
ensuite mon tableau n'est pas correcte enfin j'ai pas trop l'impression. je voudrais un tableau du style :
---------------------------------
monfichier.mtv        --> correspondant à NomTabFichier[0]
---------------------------------
essaie2.mtv           --> correspondant à NomTabFichier[1]
---------------------------------
ada.mtv               --> correspondant à NomTabFichier[2]
---------------------------------
 
or je crois pas du tout que c le cas.  
ensuite je dois faire aussi à malloc dans ma fonction ParcoursFichier pour libérer de la mémoire ?


---------------

n°735843
Taz
bisounours-codeur
Posté le 24-05-2004 à 11:54:02  profilanswer
 

« ensuite je dois faire aussi à malloc dans ma fonction ParcoursFichier pour libérer de la mémoire ? »
 
oui, c'est tout à fait ça ...

n°735858
lordankou
Posté le 24-05-2004 à 12:04:52  profilanswer
 

bon voila j'ai remodifié le code mais j'ai tjrs le prb de mon "tableau" (si c vraiment un tableau d'ailleurs).
parce que je déclare un char* (ce qui correspond à une chaine de caractère). et je le fais "NbrFichier" (=100) fois. ce qui correspond donc à un tableau.  
mais est ce que je pense bien comme le compilateur car j'ai un gros doute. j'ai pas l'impression que je déclare réellement un tableau de string mais plutot un string de longueur 100. :(


---------------

n°735859
Taz
bisounours-codeur
Posté le 24-05-2004 à 12:08:00  profilanswer
 

peut être parce que sizeof(char) != sizeof(char*) ?

mood
Publicité
Posté le 24-05-2004 à 12:08:00  profilanswer
 

n°735883
lordankou
Posté le 24-05-2004 à 12:20:03  profilanswer
 

en consultant le man, je viens de voir que malloc retourne un pointeur vers le début du bloc.  
or NomTabFichier n'est pas un pointeur mais un tableau de pointeur.
est ce qu'il faut que je crais un pointeur qui va pointer vers le début mon tableau ?  
et ensuite j'utiliserai tout le temps ce pointeur pour accéder aux différents éléments.
j'aurais donc par exemple
pointeur = &(NomTabFichier[2]);  
pointeur contiendra l'adresse de l'élément 2 c ça ? et pour voir le contenu ça sera :
*pointeur  
 
je me trompe quelque part ?  
merci d'avance


---------------

n°736154
lordankou
Posté le 24-05-2004 à 14:44:04  profilanswer
 

j'ai refait une partie du code avec une meilleure allocation de la mémoire (enfin je pense que c mieux).  
Bon le problème c que c pire.
il plante lamentablement au niveau de  
strcpy(temp,entree->d_name);  
dans la fonction parcoursFichier au niveau de la boucle. une idée ? (je désespère un peu)


---------------

n°736176
Taz
bisounours-codeur
Posté le 24-05-2004 à 14:52:42  profilanswer
 

tu fais n'importe quoi .... t'as rien bité à rien, il te manque des allocations mémoires à des endroits, à d'autres tu en fais en écrasant tes paramètres ...
 
 
NomTabFichier[i] = malloc(LongueurNom * sizeof(char *))
 
la tu te plante
 
ensuite ton test if (TabFichier == NULL) t'es gentil fallait peut être le faire avant
 
tout ça tu peux le remplacer par
 
char tab[100][64]

n°736212
cricri_
Posté le 24-05-2004 à 15:00:49  profilanswer
 

normal, tu recopies entree-> machin dans un truc non alloué ...
 

Code :
  1. char temp[64]; par example


 
puis là c'est sizeof char, pas sizeof char * je pense :

Code :
  1. TabFichier[i] = malloc(64 * sizeof(char *));


Message édité par cricri_ le 24-05-2004 à 15:08:47
n°736265
cricri_
Posté le 24-05-2004 à 15:22:48  profilanswer
 

Houlala !!! t'as encore modifié des trucs mais ce n'est tjs pas bon !
 
soit tu déclares : char temp[64]; soit char *temp; et là tu fais un malloc, mais pas les 2 !!
ça doit pas compiler d'ailleurs ...
 
Et puis je ne pige pas ce que tu fais avec ton 2ème strtok ...

n°736268
Taz
bisounours-codeur
Posté le 24-05-2004 à 15:23:42  profilanswer
 

z'en avait pas marre de faire des malloc avec des tailles statiques ?

n°736274
lordankou
Posté le 24-05-2004 à 15:25:49  profilanswer
 

j'ai remodifié le programme (encore)...
bon ça va un peu mieux
 
à l'exécution j'obtiens ça :  
nom complet : .
p apres premier decoupage : (null)
p avant comparaison : (null)
 
nom complet : ..
p apres premier decoupage : (null)
p avant comparaison : (null)
 
nom complet : VBroc16av.vit_f00007.mtv
p apres premier decoupage : VBroc16a
p avant comparaison : i
 
 
donc y'a un petit problème avec la fonction strtok. enfin je voudrais qu'il ne considère pas chaque lettre comme un séparateur mais que tout la chaine soit un séparateur. :(


---------------

n°736280
lordankou
Posté le 24-05-2004 à 15:28:52  profilanswer
 

bah euh c static pour l'instant mais après je le mettrai dans mon prog en mettant des variables après
le deuxième strtok permet de savoir euh... je crois que je sais plus pourquoi je l'ai fait ni même pk j'ai mis cette bétise. <--- va réfléchir à sa stupidité sur ce coup


---------------

n°736288
cricri_
Posté le 24-05-2004 à 15:31:14  profilanswer
 

si ça l'amuse ...
lordankou : faut éviter au maximum les allocations dynamiques, et ne les réserver qu'aux données dont la taille n'est pas connu à la compilation ou lorsqu'il y a redimensionnement, etc ...
Et puis c'est sources de bugs, faut vérifier que c'est alloué, puis ne pas oublier de désallouer, etc ..

n°736317
lordankou
Posté le 24-05-2004 à 15:56:51  profilanswer
 

bon voila modifié encore et encore... et ça marche presque (vais finir par être heureux à la fin de la journée).
alors tout d'abord je préfère le tableau dynamique pour deux raisons :  
le premier est qu'étant donné je vais parcours un répertoire je ne connais pas à priori le nombre des fichier et la longueur des fichier (quoique cette dernière vais peut être la fixer). par conséquent je pense (mais j'y connais pas grand chose) que de cette manière je risque de perdre moins de place en mémoire
La deuxième raison c qu'avec mes profs plus y'a de place gagné et meilleur sera ma note de stage.  
 
ensuite concernant la portion de code j'ai encore un problème de passage par paramètre. étant donné qu'on nous a beaucoup beaucoup apris ça (ironique) a vrai dire on y connait rien en C...
bref le problème c que là je fais un passage par valeur et que donc en retour dans mon main après l'exécution de ma fonction parcoursfichier bah j'ai un tableau vide alors que je le voudrais rempli (tout en évitant de mettre tout en variable global...).


---------------

n°736371
cricri_
Posté le 24-05-2004 à 16:13:38  profilanswer
 

pas bon :               strcpy(TabFichier[0],entree->d_name);  
c'est i l'index, et il faut l'initialiser à 0 avant le while.
 
Et si tu veux gagner de la place fait l'alloc dans ta boucle while uniquement si p != NULL
 
Et n'oublie pas la désallocation ..

n°736409
lordankou
Posté le 24-05-2004 à 16:25:04  profilanswer
 

en effet à force de faire des copier coller j'avais oublier de corriger. c fait lol de même que l'allocation dans la boucle pas bête ça !
par contre là je viens de me rendre compte d'un truc bizarre. dans le main juste après le parcours fichier il m'affiche pas le printf :(


---------------

n°736428
Taz
bisounours-codeur
Posté le 24-05-2004 à 16:29:04  profilanswer
 

utilise un tableau comme je t'ai dit, comme ça basta les allocations

n°736438
cricri_
Posté le 24-05-2004 à 16:34:53  profilanswer
 

                 TabFichier[i] = malloc(sizeof(entree->d_name));  
 
pas sizeof mais strlen(entree->d_name) + 1 je pense

n°736441
lordankou
Posté le 24-05-2004 à 16:36:36  profilanswer
 

bah franchement je préférerais ne serait ce que pour la simplicité du code mais le problème c que déjà mon jury de stage je les supportent pas et vice versa alors si je fais en plus un truc pas optimisé aie aie aie
y'aura que ma tutrice qui me dira que c un bon boulot (tant que ça marche elle s'en fout).
euh sinon t'aurais une idée pour que à la sortie de mon parcoursfichier j'ai mes valeurs dans NomTabFichier ?


---------------

n°736446
lordankou
Posté le 24-05-2004 à 16:39:27  profilanswer
 

strlen va me retourner la longueur de la chaine tandis que sizeof va retourner directement la taille. comme ça si je dois changer de type de variables ça posera pas de prb


---------------

n°736467
cricri_
Posté le 24-05-2004 à 16:52:58  profilanswer
 

si tu passes &NomTabFichier, c'est donc un char *** dans ta fonction, il te faut alors travailler avec *NomTabFichier

n°736471
lordankou
Posté le 24-05-2004 à 16:55:16  profilanswer
 

dernier petit problème.
le printf("nom du fichier dans le tableau 2 : %s \n",NomTabFichier[0]);
juste après l'appel de parcourrepertoire fait stopper le programme mais sans aucun message d'erreur.  
si je vire le [0] (un "peu" stupide) il m'arrête pas le programme (mais m'affiche des coeurs et tout ça ce qui est normal étant donné que ce n'est pas un 'caractère').
là j'avoue que je sèche (srutout qu'il n'y a aucun message d'erreur à la compilation ni à l'exécution)


---------------

n°736498
cricri_
Posté le 24-05-2004 à 17:12:52  profilanswer
 

hmm .. sizeof c'est la taille de la variable ...
donc gaffe car si c'est par example un char[] tu auras la taille de ton tableau de char, mais ta variable est char *, ça va te retourner probablement 4, mais en aucun cas la taille de ta chaine.

n°736507
cricri_
Posté le 24-05-2004 à 17:23:34  profilanswer
 

bon, j'ai fais un truc rapide, pas avec des fichiers mais de simples chaines de caractères :

Code :
  1. #include <stdio.h>
  2.   #include <math.h>
  3.   #include <stdlib.h>
  4.   #include <string.h>
  5. //  #include <dirent.h>   
  6. void ParcoursFichier(int NombreLigne, int NombreColone,char*** TabFichier);
  7.  
  8.   // ----------------------------  
  9.   // Corps du programme principal  
  10.   // ----------------------------  
  11.   int main (int argc, char *argv[ ]) {
  12.    
  13.         int NombreLigne = 100 ; // nombre de fichier max dans le tableau  
  14.         int NombreColone = 64 ; // longueur max d'un nom de fichier  
  15.         char **NomTabFichier; // tableau contenant le nom des fichiers   
  16.        
  17.         int i ; // variable temporaire  
  18.      
  19.        // Recuperation des fichier mtv  
  20.        // on va récupérer la liste des ficheir mtv  
  21.        ParcoursFichier(NombreLigne,NombreColone,&NomTabFichier);
  22.        
  23.        printf("nom du fichier dans le tableau 2 : %s \n",NomTabFichier[0]); 
  24.        printf("essaie" );   
  25.        // fin normale du programme  
  26.        return 0;
  27.            
  28.   }   
  29.      
  30.      
  31.   // parcours repertoire  
  32.   // cette fonction va parcourir le répertoire test et récup tous les fichiers mtv  
  33.   void ParcoursFichier(int NombreLigne, int NombreColone,char*** TabFichier){
  34.    
  35.         // declaration des variables  
  36.   char * Nom[] = { {"TEST.mtv"}, {"test2.mtv"}, NULL} ; // Nom du répertoire test  
  37.         char * separateur = ".mtv" ; // type de fichier recherché  
  38.        
  39.         char *p ; // variable temporaire  
  40.         int i = 0; // variable temporaire  
  41.    
  42.    
  43.         // allocation de la mémoire pour la variable NomTabFichier  
  44.         *TabFichier = (char **)malloc(NombreLigne * sizeof(char *));
  45.         //vérification de l'allocation   
  46.         if (TabFichier == NULL) 
  47.         {   
  48.               printf ("l'allocationde la mémoire a échoué. Fin du programme \n" ) ; 
  49.               exit (0) ;                           
  50.         } 
  51.    
  52.  while ( Nom[i] != NULL) {
  53.    
  54.               // on verifie si elle contient la sous chaine ".mtv"  
  55.               p = strstr(Nom[i],separateur);
  56.      
  57.               if (p!=NULL)
  58.               {         
  59.                
  60.                   // liberation de l'espace memoire       
  61.                   (*TabFichier)[i] = (char *)malloc(strlen(Nom[i])+1);
  62.                  
  63.                   // copie du nom du répertoire  
  64.                   strcpy((*TabFichier)[i],Nom[i]);
  65.                  
  66.                   // on incremente la variable i   
  67.                   i++ ;
  68.                  
  69.               }   
  70.      
  71.         } 
  72.        
  73.         // on ferme le répertoire  
  74.        
  75.   }

n°736513
cricri_
Posté le 24-05-2004 à 17:26:18  profilanswer
 

et .. fl^te j'ai oublié les free() ;)

n°737178
lordankou
Posté le 25-05-2004 à 09:33:08  profilanswer
 

mici ça marche niquel.  
par contre j'ai une question.  
pk mettre un char *** ?
parce que ça donne une pointeur sur un pointeur d'une chaine de caractêre
mais un pointeur sur une chaine de caractère ça aurait du suffir normalement non ?
a moins que l'on soit obligé pour le passage par référence du tableau. c'est à dire que le pointeur rajouté contient l'adresse du tableau que l'on passe à la fonction. ainsi on modifie bien le tableau et non juste une copie du tableau dont les valeurs seront perdus à la fin de la fonction. c'est bien ça ?
 
(N.B : j'ai mis le programme terminé en haut pour ceux que ça intéresse)


Message édité par lordankou le 25-05-2004 à 09:35:52

---------------

n°737225
cricri_
Posté le 25-05-2004 à 09:51:34  profilanswer
 

vi, Je pense, par contre ton free n'est pas suffisant, il faut également que tu libères les autres allocations, donc le mieux est d'initialiser ton tableau de pointeur à NULL, puis à la sortie tu fais une boucle qui scrute et libère tout ce qui est != NULL, et seulement après tu libère ton tableau de pointeur de char.

n°737265
lordankou
Posté le 25-05-2004 à 10:12:44  profilanswer
 

free libère l'espace pointé par le pointeur. donc si je fais free(NomTabFichier) je libère tout le tableau ou juste le pointeur pointant vers le tableau ?


---------------

n°737319
cricri_
Posté le 25-05-2004 à 10:39:35  profilanswer
 

free(NomTabFichier) libère bien le tableau de pointeur, mais pas les chaines de caractères que tu as mis, donc il faut commencer par là ;)

n°737329
Taz
bisounours-codeur
Posté le 25-05-2004 à 10:44:48  profilanswer
 

Cricri_ a écrit :

free(NomTabFichier) libère bien le tableau de pointeur

ça j'attend encore de le voir

n°737381
cricri_
Posté le 25-05-2004 à 11:05:08  profilanswer
 

Ah ? tu m'inquiètes là ...
ben en debug ça n'a plus l'air de pointer sur une zône valide, donc je ne vois pas bien pourquoi ça ne fonctionne pas d'après toi ?

n°737386
Taz
bisounours-codeur
Posté le 25-05-2004 à 11:11:53  profilanswer
 

parce que tu nommes mal les choses bordel :o

n°737394
cricri_
Posté le 25-05-2004 à 11:18:36  profilanswer
 

ok ... c'est pas un tableau mais un bloc de mémoire ..

n°737399
Taz
bisounours-codeur
Posté le 25-05-2004 à 11:23:13  profilanswer
 

comment tu veux qu'il comprenne quelquechose si dans le même phrase tu emploies pointeur et tableau pour parler de la même chose ...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [c] enregistrement des noms des fichiers dans un tableau

 

Sujets relatifs
une table de 325000 enregistrementEnregistrement successifs dasn Access VB
Access compter les enregistrementlien pour ouvrir des fichiers .PDF
Petit problème avec un transfert de tableauecrire un tableau dans un fichier
[Access] Positionner un formulaire sur un enregistrement ...[Résolu]Liste de fichiers
Extends un tableau basique, c'est impossible ?probleme upload de fichiers
Plus de sujets relatifs à : [c] enregistrement des noms des fichiers dans un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR