Bonjour à tous,

Afin de compléter une fonctionnalité de mon application et de pouvoir mettre en place un apprentissage je dois pouvoir établir des statistiques sur la fréquence des mots (mots appartenant à un lexique que j'ai mis en place dans un fichier texte: un mot par ligne ordonné alphabétiquement)sur de nombreux fichiers(corpus établi contenant 5000 fichiers html parsés en texte brut) situés dans des répertoires différents.

Malheureusement je constate que lorsque les fichiers sont en très grand nombres les derniers fichiers (>2000) ne peuvent pas être analysés correctement (voir pas du tout) du fait que l'ouverture du fichier me renvoi parfois la valeur NULL ou/et l'allocation du buffer devant recevoir ce fichier ne fonctionne pas correctement.
Ce qui est étrange c'est que ces fichiers (indiquant des erreurs pour le traitement statistiques) existent, ne sont pas vides, et leurs tailles est bien > 0 (allocation du buffer pourtant NULL) mais l'analyse ne fonctionne pas.
En revanche, le traitement de ces fichiers avec là même fonction mais de manière indépendante fonctionne correctement.

J'ai donc lû de nombreux posts depuis 2 jours abordant les problèmes liée à une utilisation simultanée de fopen (pourtant bien fermé), ou à l'allocation du buffer mais cela n'a pas résolu mon problème.

Merci d'avance pour vos conseils, et pour y voir un peu plus clair ci dessous la fonction non optimisée et un peu fouillie me permettant d'établir les statistiques (au préalable j'ai une fonction qui me liste tous les répertoires de mon corpus et pour chaque répertoire j'appelle donc la fonction compter_mots_fichiers() )

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
int compter_mots_fichiers(char * rep_convert, char * fichier_mots, char * nom_fichier_2,  char * nom_fichier_3)
{
     char  * buffer,* recherche, * str_sans_espace,ligne [1024];
     int nbr_conv=0, nombre_fichier=0, compt = 0, nbr_total_mot = 0, nombre_rep=0, nb_total,nb_fichier ;
     struct dirent *lecture;
     DIR  *rep2;     
     FILE  *fichier_2, *fichier_3, *fichier_mot;
 
     rep2 = opendir(rep_convert);    
 
     while ((lecture = readdir(rep2)))   //parcours des fichiers dans le répertoire
          nombre_rep++;
 
     fichier_2 = fopen(nom_fichier_2, "wb");            // fichier final contenant uniquement les liens 
     fichier_3 = fopen(nom_fichier_3, "wb");            // fichier final contenant uniquement les liens 
     fprintf(fichier_2, "STATISTIQUES DES DOCUMENTS DE %s \n\n", rep_convert);
     fprintf(fichier_3,"STATISTIQUES DES DOCUMENTS DE %s \n\n", rep_convert );
 
     fichier_mot = fopen ( fichier_mots, "rb" ); 
 
     if ( fichier_mot != NULL )
     {
        while ( fgets ( ligne, sizeof ligne, fichier_mot ) != NULL ) 
        {
              str_sans_espace=trim(ligne);  //efface les espaces inutiles 
              recherche=str_sans_espace;
              nb_total=0;
              nb_fichier=0;
              DIR *rep;
              rep = opendir(rep_convert);   
 
            while ((lecture = readdir(rep)))   //parcours des fichiers dans le répertoire
            {
                nombre_fichier++;
                int continuer=1;          
 
                if(nombre_fichier>2 && nombre_fichier!=nombre_rep)//&& nombre_fichier<5)          //on ignore . et ..
                {      
                        nbr_conv++;                                   
                        char lien_ini[255]={0};
                        char *nom_fichier_seul;                       
 
                        sprintf(lien_ini,"%s%s",rep_convert, lecture->d_name );
                        nom_fichier_seul = strchr(lecture->d_name, '.');         //suppression de l'extension  
 
                        if(nom_fichier_seul!=NULL)
                          *nom_fichier_seul = '\0';
 
                        FILE *fichier;
                        int taille_fichier;                    
                        char *balise_debut, *debut;              
 
                        fichier = fopen (lien_ini, "rb");
 
                        if (fichier == NULL)
                        {
                          printf("\n fichier ini vide %s, %d \n", lien_ini, nombre_fichier);
                         // return 1;
                        } 
                        else
                        {                                                                                
                            fseek (fichier, 0 , SEEK_END);                    // determine la taille du fichier
                            taille_fichier = ftell (fichier);
                            rewind (fichier);                  
                            buffer = malloc (taille_fichier);         //allocation mémoire pour le buffer d                         
 
                            if (buffer ==  NULL)                              //si buffer vide, erreur
                            {
                                   printf("\n buffer vide erreur %s => %d \n",lien_ini, taille_fichier);
                              //     return 2;        
                            }
                            else
                            {              
                                fread (buffer, 1, taille_fichier, fichier);       // copie du fichier dans le buffer/tampon                                    
                                fclose(fichier);
                                 balise_debut = recherche;                          
 
                                 while (continuer == 1)
                                 {
                                     debut = strstr(buffer, balise_debut);             //recherche dans le buffer   
 
                                     if (debut != NULL) 
                                     {   
                                         nbr_total_mot++;
                                         nb_total++;                     
                                         int fin_balise=strlen(buffer)-strlen(debut)+strlen(balise_debut) ;       
                                         buffer=buffer+fin_balise; 
                                         debut=strstr(buffer,balise_debut);         //indication du nouveau début                                          
                                     }
                                     else 
                                     {
                                            continuer = 0;                                   
                                     }                                                 
                                 }                                                       
 
                                 nb_fichier = nb_total-nb_fichier;
 
                                 if(nb_fichier>0 && nb_total>0 )
                                 {
                                     printf("Recherche du mot '%s' dans %s : %d \n", balise_debut, lien_ini, nb_fichier);
                                      fprintf(fichier_2,"Recherche du mot '%s' dans %s : %d \n", balise_debut, lien_ini, nb_fichier);
                                 }
                                 nb_fichier= nb_total; 
                             }                              
                        }                                                                     
                }                      
             } 
 
             printf("\n\n TOTAL mot %s dans '%s' : %d \n\n", recherche, rep_convert,nb_total);   
             fprintf(fichier_2,"\n TOTAL mot '%s' dans %s : %d \n\n", recherche, rep_convert,nb_total );
             fprintf(fichier_3,"%s : %d \n", recherche,nb_total );
             nb_total=0;
             nombre_fichier=0;            
       }               
 
      fclose(fichier_mot); 
     }
     else
       printf("\nprobleme fichier mot\n");     
 
 
     fprintf(fichier_2,"\n NOMBRE TOTAL MOTS : %d\n\n", nbr_total_mot);
     fprintf(fichier_2,"\0");
     fclose(fichier_2); 
     fclose(fichier_3);  
     free(buffer);  
 
   return 3;      
}