comment indexer tous les fichiers d'un repertoire en c

comment indexer tous les fichiers d'un repertoire en c - C - Programmation

Marsh Posté le 03-06-2012 à 19:48:02    

Bonjour
Dans le cadre d'un projet j'essaye de mettre en place un moteur d'indexation des fichiers d'un repertoire en langage C.Mon souci est que j'arrive a ouvrir mon repertoire et à lister les fichiers mais j'arrive pas a acceder au contenu des fichiers .  
le code que j'utilise est le suivant il compile mais j'ai un index vide  aidez moi svp :

Code :
  1. s_index make_index(int index_size, char *ad){
  2. int i;
  3. int nbl = 1;
  4. mot t_mot;
  5. s_index index;
  6. char temp[40], *tpm, c_tpm, c;
  7. FILE *fic;
  8. DIR * rep = opendir(ad);
  9. index_taille = 0;
  10.  char fn[256];
  11. //allocation de l'index
  12. index = create_index(index_size);
  13. if (rep != NULL){
  14.  struct dirent * ent;
  15.  while ((ent = readdir(rep)) != NULL){
  16.  //puts("ERREUR : le dossier existe" );
  17.  printf("%s\n", ent->d_name);
  18.   if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0){
  19.    continue;
  20.   }
  21.   snprintf(fn,sizeof fn,ad,ent->d_name);
  22.   else if ((fic = fopen(fn, "r" )) == NULL){
  23.     puts("ERREUR : le fichier n'existe pas" );
  24.     return NULL;
  25.    }
  26.   else{
  27.    while ((c = fgetc(fic))!=EOF){
  28.     i = 0;
  29.     printf("okkkk\n" );
  30.     while (!is_sep(c)){
  31.      // suppression des accents et transformation en minuscule
  32.      c_tpm = tolower(c);
  33.      temp[i] = c_tpm;
  34.      c = fgetc(fic);
  35.      i++;printf("okkkk\n" );
  36.     }
  37.     temp[i] = '\0';
  38.     if (temp[0] != '\0'){
  39.      tpm = (char *)malloc(strlen(temp));
  40.      strcpy(tpm,temp);
  41.     }
  42.     else tpm = NULL;
  43.     if (tpm != NULL){
  44.      t_mot = create_mot(tpm, nbl);
  45.      if(index->tab_size == 26)
  46.       insere_mot(&index->tab[tpm[0]-'a'], t_mot, &index);
  47.      else
  48.       insere_mot(&index->tab[0], t_mot, &index);
  49.     }
  50.     if (c == '\n')
  51.      nbl++;
  52.    }
  53.   }
  54.  }
  55. puts("les fichiers ont bien ete indexe" );
  56. }
  57. return index;
  58. }


Message édité par gilou le 03-06-2012 à 21:34:02
Reply

Marsh Posté le 03-06-2012 à 19:48:02   

Reply

Marsh Posté le 04-06-2012 à 11:31:31    

Cela ne devrait même pas compiler, il doit y avoir une erreur de copier coller :

Code :
  1. while ((ent = readdir(rep)) != NULL)
  2.   {
  3.    //puts("ERREUR : le dossier existe" );
  4.    printf("%s\n", ent->d_name);
  5.    if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0)
  6.    {
  7.     continue;
  8.    }
  9.    snprintf(fn,sizeof fn,ad,ent->d_name);  <== ici
  10.    else                                                <== ici
  11.    if ((fic = fopen(fn, "r" )) == NULL)
  12.    {
  13.     puts("ERREUR : le fichier n'existe pas" );
  14.     return NULL;
  15.    }

Les fichiers sont ouverts et jamais fermés et comme on n'a pas le code de insere_mot ...

Reply

Marsh Posté le 04-06-2012 à 11:56:54    

De toute façon, une fonction "indexer répertoire" devrait faire appel à une fonction "indexer fichier" (qui aurait permis d'encadrer proprement l'appel avec un open et un close du fichier). Inutile de continuer tant que c'est architecturé avec les pieds.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-06-2012 à 14:20:02    

En effet il y'avait une de copier coller . J'ai bien essayé de mettre en place une fonction indexer fichier mais comme j'essaye de creer un seul index pour tout les fichiers du repertoire je me pose des questions au niveau du chainage.Mais voici quand meme le code de la fonction insere_mot et de la fonction creer_index car je suis pas tres a l'aise avec les fichiers et les pointeurs ...
 

Code :
  1. void insere_mot (mot *o_mt, mot t_mt, s_index *index)
  2. {
  3. mot temp, ptr;
  4. ptr = *o_mt;
  5. while( ptr->suiv != NULL && strcmp(t_mt->mt,ptr->suiv->mt) >0)
  6.  ptr = ptr->suiv;
  7. if (ptr->suiv != NULL && strcmp(t_mt->mt, ptr->suiv->mt) == 0)
  8. {
  9.  ptr->suiv->occ++;
  10.  insere_ligne(&ptr->suiv->l_lg, t_mt->l_lg->suiv);
  11.  free(t_mt);
  12. }
  13. else
  14. {
  15.  index_taille += (strlen(t_mt->mt) + 1 + 2);
  16.  (*index)->count_mot++;
  17.  temp = ptr->suiv;
  18.  ptr->suiv = t_mt;
  19.  t_mt->suiv = temp;
  20. }
  21. }
  22. // insertion d'une ligne dans une struture mot
  23. void insere_ligne (ligne *o_l, ligne t_l)
  24. {
  25. ligne temp, ptr;
  26. ptr = *o_l;
  27. while (ptr->suiv != NULL)
  28.  ptr = ptr->suiv;
  29. if (ptr->lg != t_l->lg)
  30. {
  31.  index_taille += 2;
  32.  temp = ptr->suiv;
  33.  ptr->suiv = t_l;
  34.  t_l->suiv = temp;
  35. }
  36. else free(t_l);
  37. }
  38. s_index make_index(int index_size, char *ad){
  39. int i;
  40. int nbl = 1;
  41. mot t_mot;
  42. s_index index;
  43. char temp[40], *tpm, c_tpm, c;
  44. FILE *fic;
  45. DIR * rep = opendir(ad);
  46. index_taille = 0;
  47. char fn[256];
  48. //allocation de l'index
  49. index = create_index(index_size);
  50. if (rep != NULL){
  51. struct dirent * ent;
  52. while ((ent = readdir(rep)) != NULL){
  53. //puts("ERREUR : le dossier existe" );
  54. printf("%s\n", ent->d_name);
  55.  if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0){
  56.    continue;
  57.  }
  58.  snprintf(fn,sizeof fn,ad,ent->d_name);
  59.  if ((fic = fopen(fn, "r" )) == NULL){
  60.     puts("ERREUR : le fichier n'existe pas" );
  61.     return NULL;
  62.    }
  63.  else{
  64.    while ((c = fgetc(fic))!=EOF){
  65.     i = 0;
  66.     printf("okkkk\n" );
  67.     while (!is_sep(c)){
  68.      // suppression des accents et transformation en minuscule
  69.      c_tpm = tolower(c);
  70.      temp[i] = c_tpm;
  71.      c = fgetc(fic);
  72.      i++;printf("okkkk\n" );
  73.     }
  74.     temp[i] = '\0';
  75.     if (temp[0] != '\0'){
  76.      tpm = (char *)malloc(strlen(temp));
  77.      strcpy(tpm,temp);
  78.     }
  79.     else tpm = NULL;
  80.     if (tpm != NULL){
  81.      t_mot = create_mot(tpm, nbl);
  82.      if(index->tab_size == 26)
  83.       insere_mot(&index->tab[tpm[0]-'a'], t_mot, &index);
  84.      else
  85.       insere_mot(&index->tab[0], t_mot, &index);
  86.     }
  87.     if (c == '\n')
  88.      nbl++;
  89.    }
  90.  }
  91. }
  92. puts("les fichiers ont bien ete indexe" );
  93. }
  94. return index;
  95. }

Reply

Marsh Posté le 04-06-2012 à 16:48:03    

C'est pourtant pas dur:
tu crées ta structure d'index
1) tu ouvres le répertoire
2) tu boucles sur les fichiers du répertoire
    3) si c'est un fichier (et non pas un répertoire, ce qui va permettre d'exclure . et .. mais aussi les sous répertoires éventuels)
    4) tu ouvres le fichier
    5) tu indexes le fichier
    6) tu fermes le fichier
7) tu fermes le répertoire
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-06-2012 à 01:44:05    

gilou a écrit :

C'est pourtant pas dur:
tu crées ta structure d'index
1) tu ouvres le répertoire
2) tu boucles sur les fichiers du répertoire
    3) si c'est un fichier (et non pas un répertoire, ce qui va permettre d'exclure . et .. mais aussi les sous répertoires éventuels)
    4) tu ouvres le fichier
    5) tu indexes le fichier
    6) tu fermes le fichier
7) tu fermes le répertoire
 
A+,


 J'ai essayé de faire comme tu la dit mais j'ai toujours des soucis au niveau de la lecture du fichier car j'ai toujours un index vide (ce qui n'est pas normal lol).Mon programme n'entre meme pas dans la boucle qui doit parcourir le fichier et recuperer les données dans le fichier .selon moi c'est cette partie du code qui marche pas  

Code :
  1. //allocation de l'index
  2. index = create_index(index_size);
  3. if (rep != NULL){
  4.  struct dirent * ent;
  5.  while ((ent = readdir(rep)) != NULL){
  6.  //puts("ERREUR : le dossier existe" );
  7.  printf("%s\n", ent->d_name);
  8.   if(strcmp(ent->d_name,"." )==0|| strcmp(ent->d_name,".." )==0){
  9.    continue;
  10.   }
  11.   snprintf(fn,sizeof fn,ad,ent->d_name);
  12.   if (fic = fopen(fn, "r" )){          //a partir d'ici je recupere rien dans le fichier
  13.    while ((c = fgetc(fic))!=EOF){  //je rentre jamais dans cette boucle je sais pas pourquoi
  14.     i = 0;
  15.     while (!is_sep(c)){
  16.      // suppression des accents et transformation en minuscule
  17.      c_tpm = tolower(c);
  18.      temp[i] = c_tpm;
  19.      c = fgetc(fic);
  20.      i++;//printf("okkkk\n" );  
  21.     }
  22.     temp[i] = '\0';
  23.     if (temp[0] != '\0'){
  24.      tpm = (char *)malloc(strlen(temp));
  25.      strcpy(tpm,temp);
  26.     }
  27.     else tpm = NULL;
  28.     if (tpm != NULL){
  29.      t_mot = create_mot(tpm, nbl);
  30.      if(index->tab_size == 26)
  31.       insere_mot(&index->tab[tpm[0]-'a'], t_mot, &index);
  32.      else
  33.       insere_mot(&index->tab[0], t_mot, &index);
  34.     }
  35.     if (c == '\n')
  36.      nbl++;
  37.    }
  38.   }close(fic);
  39.  }
  40. closedir(rep);
  41. puts("les fichiers ont bien ete indexe" );
  42. }
  43. return index;


 

Reply

Marsh Posté le 05-06-2012 à 12:34:25    

Tant que tu passeras pas ton temps à rendre ça modulaire (c'est a dire en fonctions au rôle clairement défini aux fonctionalités testables sans avoir a faire fonctionner du code supplémentaire), je vais pas trop chercher à comprendre un code dont on n'a pas tous les morceaux.
Parce que ici, il est clair qu'on devrait avoir une logique dans le style:
 
while ( line = get_next_line(fichier)) {
    ++line;
    while (mot = get_next_mot(line)) {
        insère_mot(normalise_mot(mot), &index);
    }
}
 
et que tout faire en monobloc rend ça opaque et pas facilement testable.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-06-2012 à 14:44:42    

Bon, pour ceux que ça intéresse, les deux erreurs a corriger:
close(fic); ça doit être fclose(fic); et le couper-coller l'a mis après l'accolade, ça devrait être avant.
snprintf(fn,sizeof fn,ad,ent->d_name); n'a pas l'indication de format, ça doit être snprintf(fn,sizeof fn,"%s\\%s", ad,ent->d_name); sous Windows (et snprintf(fn,sizeof fn,"%s/%s", ad,ent->d_name); sous linux) sinon aucun fichier n'est ouvert d'ou l'index vide.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-06-2012 à 23:32:03    

merci d'avoir pris le temps de m'aidez !!!!!Sa me vas droit au coeur

Reply

Marsh Posté le 05-06-2012 à 23:36:23    

Il me reste deux trois trucs a reglé et c'est ok!!!!!thanks u i appreciated that

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed