Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

garder une trace des donnees dans un tableau help!!!

2 réponses
Avatar
betatest
Voil=E0, je voudrais garder une trace de ce qui est lu dans un fichier
texte pour un classement dans un fichier texte, voici le source :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void charge_struct(char *buffer);
char *cha[13];
int i=3D0;
main()
{
/* on affiche les chariots */
system("CLS");
char caract, buff[2056];
int a;
FILE *fin;
char filename1[]=3D"sortie.txt";
if ((fin =3D fopen(filename1, "r")) =3D=3D NULL)
{
puts("\nProbleme avec le fichier sortie.txt");
}
else
{
while (!feof(fin))
{
fgets(buff, 2056, fin);
do
{
charge_struct(buff);
printf("cha[%d] =3D %s - %s\n",i,cha[i],cha[i-1]);
fflush(stdin);
caract=3Dgetch();
if (caract=3D=3D'q')
break;
}
while (!caract);
if (caract=3D=3D'q')
break;
i++;
if(i>12) i=3D0;
}
fclose(fin);
system("PAUSE");
}
}
void charge_struct(char *buff)
{
char *p;
p =3D strtok( buff, ";\"");
cha[i] =3D p;
printf("p =3D %s - cha-1 =3D %s\n",cha[i],cha[i-1]);
p =3D strtok(NULL,";\"");
// =3D p;
}

mais comme r=E9sultat le tableau de caract=E8res ne garde pas la trace de
la lecture buffer - 1 dans cha[i-1].

Comment puis-je faire ?

Par avance merci.

Ps : d=E9sol=E9 pour le code mais cela fait un moment que je torture ce
morceau dans tous les sens si bien que je ne sais plus en j'en suis.

2 réponses

Avatar
Yves ROMAN
"betatest" a écrit dans le message de news:

Voilà, je voudrais garder une trace de ce qui est lu dans un fichier
texte pour un classement dans un fichier texte, voici le source :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void charge_struct(char *buffer);
char *cha[13];
int i=0;
main()
{
/* on affiche les chariots */
system("CLS");
char caract, buff[2056];
int a;
FILE *fin;
char filename1[]="sortie.txt";
if ((fin = fopen(filename1, "r")) == NULL)
{
puts("nProbleme avec le fichier sortie.txt");
}
else
{
while (!feof(fin))
{
fgets(buff, 2056, fin);

Tu devrais tester le fgets(), car le feof() n'est vrai qu'apres une erreur
du fgets()
Ou au moins faire buff[à] = '' ; avant le fgets

do
{
charge_struct(buff);
printf("cha[%d] = %s - %sn",i,cha[i],cha[i-1]);

Attention : la 1ere fois tu affiches cha[0] et cha[-1], ce qui a des chances
de planter
Tu pourrais initialiser cha[0] avec "" et faire varier i de 1 a 12

fflush(stdin);
caract=getch();
if (caract=='q')
break;
}
while (!caract);
if (caract=='q')
break;
i++;
if(i>12) i=0;
}
fclose(fin);
system("PAUSE");
}
}
void charge_struct(char *buff)
{
char *p;
p = strtok( buff, ";"");
cha[i] = p;

Ici, p va contenir soit buff soit NULL
(Tu devrais tester s'il vaut NULL !...)
Sinon, cha[i] va toujours contenir l'adresse de buff de main()
Donc cha[i] == cha[i-1]

A chaque nouvelle lecture tu modifies le contenu de buff, et donc tu
affiches
toujours la derniere ligne lue

printf("p = %s - cha-1 = %sn",cha[i],cha[i-1]);
p = strtok(NULL,";"");
// = p;
}

mais comme résultat le tableau de caractères ne garde pas la trace de
la lecture buffer - 1 dans cha[i-1].

Car il est ecrase a chaque lecture

Comment puis-je faire ?


Pour eviter cela, il faut mettre un copie de p dans cha[i]
Par exemple avec strdup() ou un equivalent.
Il faut donc au debut initialiser tous les cha[i] avec NULL, puis dans ta
fonction

if ( cha[i] != NULL ) free(cha[i]) ;
cha[i] = malloc(strlen(p)+1) ;
if (cha[i] != NULL)
{
strcpy(cha[i],p) ;
printf("p = %s - cha-1 = %sn",cha[i],cha[i-1]);
}

Et en fin de programme, liberer les cha[i] non NULL
Avatar
betatest
Milles MERCIS !!!

Tu est un DIEU vivant, non sans blague j'ai cru devenir fou à force de
chercher, bon il ne s'agit que d'un semblant de morceau du code de
l'appli, mais je butais sur ce bug.

C'est donc avec soulagement et reconnaissance que je te dis encore
merci.