Problème lecture de fichier en C

Taoufik -  
fiddy Messages postés 11069 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.

#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;
}


A voir également:

3 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
2
Taoufik
 
merci beaucoup,
j'ai pas bien compris le conseil pour le fgetc(file), tu pourrais me donner un exemple pour que ce soit clair pour moi stp (jsuis débutant désolé)
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
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 :)
0
Taoufik
 
oui mais je sais utiliser fgetc, le truc c'est que je vois pas comment pour ce cas ci, jvois pas comment tu veux que j'utilise fgetc ici car fgetc renvoi un entier et le truc c'est qu'on veut justement modifié la valeur de la variable qui retient le \n par un \0 donc j'ai pas compris
0
Taoufik
 
De plus le pointeur en paramètre de fgetc c'est file alors qu'ici on veut juste buff ( ce qu'il lit a chaque ligne)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Effectivement, j'ai pas bien lu ton code.
Dans ce cas, es-tu sûr que chacune de tes lignes fait bien moins de 79 caractères ?
Comment est construit ton fichier ? Des lignes vides ? Merci de donner un exemple.
0
Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
il faudrait plutot que tu utilises calloc, pour les tableaux, non ?
0
Taoufik
 
je ne l'ai jamais utilisé encore mais pourquoi spécifiquement calloc pour ce cas??
0