Problème lecture de fichier en C

Fermé
Taoufik - 28 févr. 2012 à 15:50
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 mars 2012 à 21:04
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 28/02/2012 à 19:25
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
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 jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 663
28 févr. 2012 à 22:32
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
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 févr. 2012 à 08:28
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 jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 663
28 févr. 2012 à 16:28
il faudrait plutot que tu utilises calloc, pour les tableaux, non ?
0
je ne l'ai jamais utilisé encore mais pourquoi spécifiquement calloc pour ce cas??
0