Problème lecture de fichier en C
Taoufik
-
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 441 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
je voudrais lire des éléments dans un fichier et les placer dans un tableau mais ça ne m'affiche pas ce qu'il faut, ya des décalage et des données perdu donc je sais pas si c'est au niveau des fgets ou autre chose, si quelqu'un saurait m'aider ce serait sympa.
je voudrais lire des éléments dans un fichier et les placer dans un tableau mais ça ne m'affiche pas ce qu'il faut, ya des décalage et des données perdu donc je sais pas si c'est au niveau des fgets ou autre chose, si quelqu'un saurait m'aider ce serait sympa.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *file=fopen("stock.txt","r");
char buff[80];
int i;
double *price;
char *category[30];
char *name[30];
char *c;
int nbItems;
if(file == NULL)
{
printf("\n impossible d'ouvrir le fichier stock \n\n");
return -1;
}
fgets(buff,80,file);
sscanf(buff, "%d", &nbItems);
price=malloc(nbItems * sizeof(double));
//category=malloc(nbItems * sizeof(char*));
//name=malloc(nbItems * sizeof(char*));
for(i=0;i<nbItems;i++)
{
fgets(buff,80,file);
if ((c=strrchr(buff, '\n')) != NULL) *c='\0'; // purge du '\n' terminant chaque ligne d'un fichier texte
name[i]=malloc(strlen(buff) + 1);
strcpy(name[i], buff);
fgets(buff,80,file);
if ((c=strrchr(buff, '\n')) != NULL) *c='\0'; // purge du '\n' terminant chaque ligne d'un fichier texte
category[i]=malloc(strlen(buff) + 1);
strcpy(category[i], buff);
fgets(buff,80,file);
// ici la purge du '\n' terminant chaque ligne d'un fichier texte est inutile vu que le sscanf() va l'ignorer
sscanf(buff, "%lf", &price[i]);
}
fclose(file);
for(i=0;i<nbItems;i++)
{
printf("i=%d %d - name=%s, category=%s, price=%.2lf\n", i,nbItems, name[i], category[i], price[i]);
//free(name[i]);
//free(category[i]);
}
free(name);
free(category);
free(price);
return 0;
}
3 réponses
-
Bonjour
L'avantage du calloc permet d'initialiser les tableaux à 0. Pour ma part, je trouve qu'ici ce n'est pas une bonne idée puisque tu perdras en performance.
// ici la purge du '\n' terminant chaque ligne d'un fichier texte est inutile vu que le sscanf() va l'ignorer
Effectivement, sauf que le flux fichier pointera sur le '\n' et que lors de la prochaine itération, ton fgets lira uniquement '\n' créant tout le décalage.
Je te conseille donc de faire un fgetc(file) pour décaler le pointeur du flux en début de la ligne suivante.
Sinon quelques remarques sur le programme :
printf("i=%d %d - name=%s, category=%s, price=%.2lf\n", i,nbItems, name[i], category[i], price[i]);
Ce n'est pas %lf qu'il faut mettre ici mais %f.
Ton programme gagnerait en lisibilité si tu faisais des fonctions puisqu'on voit plusieurs blocs logiques similaires (fgets / strchr / strlen / strcpy).
Et ce n'est pas -1 qu'on retourne lorsque le programme échoue mais plutôt EXIT_FAILURE qui vaut 1 la plupart du temps.
Cdlt,
Google is your friend-
-
fgets lit une ligne, fgetc lit un caractère (le saut de ligne)
voir l'aide sur getc dans google, par exemple ici : http://www.cplusplus.com/reference/cstdio/fgetc/
et redemande si après ça tu n'as toujours pas compris :) -
-
-
-
-
il faudrait plutot que tu utilises calloc, pour les tableaux, non ?
-