[ C ] lire un fichier text ligne par ligne

Fermé
bil808 Messages postés 21 Date d'inscription mardi 20 novembre 2007 Statut Membre Dernière intervention 10 février 2008 - 10 févr. 2008 à 11:15
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 - 10 févr. 2008 à 12:46
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

2 réponses

fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 813
10 févr. 2008 à 11:33
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 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 124
10 févr. 2008 à 12:46
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