[ C ] lire un fichier text ligne par ligne

bil808 Messages postés 21 Statut Membre -  
Mahmah Messages postés 497 Statut Membre -
Bonjour,
voila j'ai un petit soucis avec ce programme en c qui récupére un fichier text et qui stock son contenue ligne par ligne dans un un tableau de pointeurs
,le programme compile bien sauf que dans l'execution il m'affiche que la derniere dans tous le tableau.

int main (){

FILE *fic;

char ligne_lu [512]; // tableau tompon qui va contenir la ligne courante
char *t_lignes[500]; // tableau de pointeur dont chaque case va pointé sur une ligne extraite du fichier
char *ptr; // pointeur tompon qui va contenir l'adresse de la ligne courante
int i,j;

fic_r = fopen("resultat_mot.txt", "r"); // j'ouvre mon fichier en ecriture
if ( ! fic_r ) printf ("Pb ouverture du fichier en lecture \n");

while(fgets(ligne_lu, 512, fic) != NULL){ // je recupére la ligne courante

ptr=ligne_lu; // je récupére l'adresse de la ligne courante
t_lignes[i]=ptr; // je stock cette adresse dans le tableau des ligne
i++; // j'incremente l'indice du tableau ligne pour stocker les adresse suivante
}

fclose(fic); // je freme le fichier

for(j=0;j<i;j++) // je réaffiche le tableau pour vérifier son contenue et la surprise
printf("%d: %s\n",j,t_lignes[j]);

system("PAUSE");
return 0;
}

merçi pour votre aide
A voir également:

2 réponses

fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,

En fait, tu sauvegardes le pointeur ligne_lu dans le tableau. Et à l'itération suivante, tu sauvegardes la nouvelle valeur dans ligne_lu. Donc toutes les données du tableau pointent maintenant vers la nouvelle valeur. Et tout ceci jusqu'à la dernière itération. D'où ton problème.
Le mieux serait de sauvegarder dans ton tableau les valeurs et non les pointeurs. Pour ceci tu devras utiliser la fonction strcpy.

PS : n'oublie pas d'initialiser i à 0 ;)

Cordialement
0
Mahmah Messages postés 497 Statut Membre 125
 
Bonjour,

En effet, ligne_lu est un tableau et son adresse ne change jamais au cours de ton programme, seules ses données varient.
Et donc ptr = ligne_lu récupère toujours la même adresse. (Tu pourras même constater ceci en affichant les pointeurs stockés dans t_lignes)
for ( unsigned int i = 0 i != 500 ; i++ )
   printf( %3d : %p\n, i, t_ligne + i );


Ce qu'il te faut c'est garder une trace en mémoire de toutes les lignes. Soit tu fais un giga tableau pour contenir tout ça, soit tu veux un programme propre et il faut demander de la mémoire et recopier chaque ligne dedans.
(Et là deux solutions : malloc + strcpy ou strdup qui fait les deux en un. Et quoiqu'il en soit, un free pour libérer la mémoire à la fin du programme (1 malloc ou 1 strdup = 1 free)

M.
0