IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème modification de fichier


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Problème modification de fichier
    Bonsoir à tous,
    Dans le code qui suit, pourriez vous m'expliquer pourquoi si je fais un test de lecture a la fin de ma fonction modif_stock, le stock réel est bien modifier, mais une fois que je veux lire le fichier article après la fin de mon programme, aucune modification n'y à été enregistrée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <assert.h>
    #include <myconio.h>
    #include <ctype.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct article
    {
        char code[10];
    	char desc[30];
    	int stock_min;
    	int stock_reel;
    };
     
    struct vente
    {
        int code;
        int vendu;
    };
     
    void lect_vente(struct vente* une_vente, FILE*);
    void rech_article(struct article* un_article, struct vente une_vente, FILE*);
    void modif_stock(struct article* un_article, struct vente une_vente, FILE*);
     
    int main ()
    {
       FILE* fic_vente;
       FILE* fic_article;
       struct article un_article;
       struct vente une_vente;
       int stock_min, stock_reel ;
     
       fic_vente = fopen("vente.txt", "r");
       assert(fic_vente != NULL);
       fic_article = fopen("article.dat", "r+b");
       assert(fic_article != NULL);
     
       while(!feof(fic_vente))
       {
           lect_vente(&une_vente, fic_vente);
           rech_article(&un_article, une_vente, fic_article);
           modif_stock(&un_article, une_vente, fic_article);
       }
       fclose(fic_vente);
       fclose(fic_article);
    }
     
    void lect_vente(struct vente* une_vente, FILE* fic_vente)
    {
        char chaine[10];
     
        fgets(chaine, sizeof(une_vente->code), fic_vente);
        une_vente->code = atoi(chaine);
        fgets(chaine, sizeof(une_vente->vendu), fic_vente);
        une_vente->vendu = atoi(chaine);
    }
     
    void rech_article(struct article* un_article, struct vente une_vente, FILE* fic_article)
    {
        int nbr_enreg, nbr_octets;
     
        fseek(fic_article, 0, SEEK_END);
        nbr_octets = ftell(fic_article);
        nbr_enreg = (nbr_octets/sizeof(struct article))/2;
        fseek(fic_article, (nbr_octets) - sizeof(struct article)*((nbr_enreg)+1), SEEK_SET);
     
        fread(un_article, sizeof(struct article), 1, fic_article);
     
        while(atoi(un_article->code) != une_vente.code)
        {
            if(une_vente.code < atoi(un_article->code))
            {
                nbr_enreg = nbr_enreg/2;
                if (nbr_enreg < 1)
                      nbr_enreg = 1;
     
                fseek(fic_article, -sizeof(struct article), SEEK_CUR);
                fseek(fic_article, -sizeof(struct article) * nbr_enreg , SEEK_CUR);
                fread(un_article, sizeof(struct article), 1, fic_article);
            }
            else
            {
                nbr_enreg = nbr_enreg/ 2;
                if(nbr_enreg<1)
                    nbr_enreg = 1;
     
                fseek(fic_article, -sizeof(struct article), SEEK_CUR);
                fseek(fic_article, sizeof(struct article) * nbr_enreg , SEEK_CUR);
                fread(un_article, sizeof(struct article), 1, fic_article);
            }
        }
    }
     
    void modif_stock(struct article* un_article, struct vente une_vente, FILE* fic_article)
    {
        un_article->stock_reel -= une_vente.vendu;
        fwrite(&un_article, sizeof(struct article), 1, fic_article);
    }
    Je vous remercie d'avance pour vos réponse

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Ligne 98 : fwrite(&un_article, sizeof(struct article), 1, fic_article);. Il me semble que c'est toujours le même problème

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Non, j'ai bien essayé en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(un_article, sizeof(struct article), 1, fic_article);
    avant de venir poser la question, mais ça ne change rien, les modifications ne sont pas enregistrée dans le fichier

  4. #4
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Comme l'a dit gerald3d, ta structure est déjà un pointeur, tu n'as donc pas besoin de passer l'adresse dans fwrite.
    Cependant le problème ne vient pas de là dans ton code, mais plutôt que tu ne repositionnes pas l'offset à la fin dans ta fonction rech_article.

    ce qui fait que dans ce code (qui est incorrect au passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while(!feof(fic_vente))
    {
           lect_vente(&une_vente, fic_vente);
           rech_article(&un_article, une_vente, fic_article);
           modif_stock(&un_article, une_vente, fic_article);
    }
    L'indicateur de flux n'est pas repositionné au début du fichier quand tu fais appel à modif_stock.
    Rajoutes ceci :
    Ensuite pour revenir à ta boucle de lecture/écriture de fichier, feof ne s'utilise pas de cette manière, tu fais un test sur la fin de fichier de fic_vente, et dans la même boucle tu cherches à tester fic_article, mais qui te dis que ces 2 fichiers ont la même taille, de plus feof ne teste la fin qu'après l'avoir atteint pas avant.

    Une utilisation possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    while(fgets(buf, sizeof(buf), fic_vente != NULL)
    {
       lect_vente(&une_vente, fic_vente);
    }
     
    while(fgets(buf, sizeof(buf), fic_article!= NULL)
    {
           rech_article(&un_article, une_vente, fic_article);
           rewind(fic_article);
           modif_stock(&un_article, une_vente, fic_article);
    }

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    ça ne change rien au fait que les modifications ne sont pas enregistrées à la fin de mon programme
    De plus je ne comprend pas pourquoi toutes ces modifications :-/
    La différence de taille entre les deux fichier n'est pas importante vu que je ne veux modifier que les articles qui se trouvent dans mon fichier vente.
    Ensuite je ne veux pas me repositionner au début du fichier avant de lancer modif_stock vu que c'est l'article pointé précédemment dans rech_article qui devras être modifié.
    en fait quand je rajoute une ligne de lecture du fichier article à la fin de modif_stock, le programme à l'air de bien faire tout ce que je veux, sauf l'enregistrement des donnée
    Et j'ai bien essayer de faire les modifications que tu m'as proposée, mais ça à planté :-/

    Edit, ha oui et pour ce qui est de feof, j'ai fais comme mon prof m'a appris, j'ai fais une lecture d'avance, ce qui devrais régler le problème qu'il ne le test que après et pas avant
    Enfin, je pense ou alors j'ai tout compris de travers et ne suis pas fais pour programmer

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je regarde rapidement le code et la boucle while dans le même me parait étrange. Déjà, car feof() ne devrait pas être utilisé comme ceci (voir http://c.developpez.com/faq/?page=En...-fonction-feof) mais aussi car on teste un seul des deux fichiers.

    Dans lect_vente(), tu pourrais utiliser fscanf() pour lire tes nombres puisqu'on fichier semble formaté et donc adapté aux fonctions xscanf(). D'ailleurs, es-tu certain que tes fgets() lisent ce que tu souhaites ? Sans tester et juste en lisant, je pense que ça lit 2 fois 4 caractères, ce qui ne revient pas à lire 2 ints...

    Dans rech_article(), tu calcules sizeof(struct article) de nombreuses fois. Tu devrais stocker dans une variable locale pour plus de lisibilité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(fic_article, (nbr_octets) - sizeof(struct article)*((nbr_enreg)+1), SEEK_SET);
    C'est pour revenir au début du fichier ? Pourquoi ne pas faire un simple rewind() si tel est le cas ? A quoi cela sert-il sinon ? En fait, tu fais une sorte de recherche dichotomique en partant du milieu du fichier ? Dans ce cas, ta variable nommée nbr_enreg est très trompeuse.

    Le fichier étant binaire, tu pourrais mettre un int au début avec le nombre d'articles dedans, ça t'éviterait cette manœuvre de parcours complet à chaque fois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fread(un_article, sizeof(struct article), 1, fic_article);
    Cette ligne apparait 3 fois. Tu devrais peut-être revoir la logique de la boucle. D'ailleurs, tu ne vérifies jamais si cette lecture échoue ou pas. En allant plus loin, on s'aperçoit que les fseek() sont très semblables et les modifications du nombre d'enregistrements restant à parcourir sont très sembalble, il y a beaucoup de code à factoriser.

    Tu ne vérifies jamais que fseek() n'échoue pas, tu devrais peut-être : http://manpagesfr.free.fr/man/man3/fseek.3.html

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Ok merci, je vais commencer par aller voir les liens que tu m'a filer et essayer de modifier ça

Discussions similaires

  1. [WD17] Problème avec DLL de modification des fichiers Hyerfiles
    Par lololebricoleur dans le forum WinDev
    Réponses: 8
    Dernier message: 07/01/2013, 18h15
  2. [WD-2010] Problème modification des liens d'accès aux fichiers
    Par angelino69 dans le forum VBA Word
    Réponses: 4
    Dernier message: 15/02/2012, 09h52
  3. problème de modification du fichier Excel
    Par akharraz dans le forum Général Java
    Réponses: 3
    Dernier message: 02/02/2012, 19h19
  4. Problème modification d'un fichier txt
    Par YoshioToutou dans le forum C
    Réponses: 6
    Dernier message: 20/03/2011, 23h10
  5. Problème de lecture, modification de fichier
    Par florian L'charentais dans le forum MATLAB
    Réponses: 3
    Dernier message: 27/11/2008, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo