garder une trace des donnees dans un tableau help!!!
2 réponses
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
Et en fin de programme, liberer les cha[i] non NULL
"betatest" <laurent.bouchet@coframa.fr> a écrit dans le message de news:
1123155709.620222.133360@z14g2000cwz.googlegroups.com...
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
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
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
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
Et en fin de programme, liberer les cha[i] non NULL
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.
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.
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.