Salut a tous,

Voila, je lis un fichier texte ligne par ligne dont je connais pas le nombre de ligne. Je pourrais lire le fichier une 1ere fois pour determiner le nombre de ligne et faire un malloc ensuite. mais pour de gros fichier, ce la peut etre lourd (je parle de fichiers de + de 2 milions de lignes)

Une autre solution est d'utiliser un malloc initial suivit de realloc a chaque ligne. Mais cela peut etre aussi lourd (voire meme plus que lire le fichier 2 fois)
Une solution serait de faire ca par bloque de N (avec N=1 milion par example)
Si on atteint la fin du 1er bloque, on aggrandit la table de N.

ci-joint un code qui simule une lecture de fichier par une boucle for de i=0 a 45 en remplissant des tables avec tab[i]=1.5*i et name[i]="blabla"
(la je connais la longueur pour debuger plus facilement). ca fonctionne bien avec ma table de double, mais pas avec ma table de *char

je ne pense que je ne fais pas les realloc correctement...

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
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
 
double *tab;
char **name;
 
int N=10;
int j=0,ii=0,i=0,k=1;
 
tab = (double*)malloc((N*k) * sizeof (double));
 
name = (char**)malloc((N*k) * sizeof (*name));
for(i=0;i<(N*k);i++){name[i] = (char*)malloc(10 * sizeof (**name));}
 
for(i=0;i<45;i++){  /*loop starts*/
 
    tab[i] = 1.5*i;
    name[i] = "blabla";
 
    if((i+1)%(N)==0){  /*if initial allocation filled up*/
 
       /*realloc some more memory */                 
       k++;
       printf("realloc at %d \n",N*k); 
 
       tab = (double*)realloc(tab,(N*k) * sizeof (double));
 
       name = (char**)realloc(name,(N*k) * sizeof (*name));
       for(ii=0;ii<(N*k);ii++){name[ii] = (char*)realloc(name[ii],10 * sizeof (**name));}
 
    }
 
j++;
 
}  /*loop ends*/
 
 
if(N*k>j){ /*if realloced too much memory*/ 
 
   /*realloc down to the right value*/                 
   printf("final realloc at %d",j); 
 
   tab = (double*)realloc(tab,j * sizeof (double));
 
   name = (char**)realloc(name,(j+1) * sizeof (*name));
   for(ii=0;ii<(j+1);ii++){name[ii] = (char*)realloc(name[ii],10 * sizeof (**name));}
 
}
 
/*
printf("\n\n");   
for(i=0;i<j;i++){
printf("tab[%d]=%f\n",i,tab[i]);                 
//printf("name[%d]=%s\n",i,name[i]);                            
}  
*/ 
 
return 0;
}
J'esperes que j'etais clair...

merci d'avance

Dave