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 :

Gestion de fichier


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Par défaut Gestion de fichier
    Bonjour,

    J'ai un problème concernant la manipulation de fichier

    J'ai une fonction qui écrit un flottant dans un fichier texte sous "cache/manger.txt", le flottant à la forme "x.xxxxxx".

    la fonction suivante est censée reprendre la valeur comprise dans ce fichier et la mettre dans un autre fichier "un fichier de sauvegarde"

    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
       const gchar *sText;
       FILE *f;
       char type[] ="";
       float manger;
     
        manger=0;
     
        f = fopen("cache/manger.txt","r");
        fscanf(f, "%1.6f", manger);
        fclose(f);
     
        sprintf(type,"save/%s.txt",sText);
        f = fopen(type, "w");
        fprintf(f,"%1.6f",manger);
        fclose(f);
    le sText est le nom du fichier sous lequel l'utilisateur veut enregistrer

    Le programme compile, s'exécute, je peux enregistrer la partie (c'est un jeu), mais dans le fichier de sauvegarde il n'y a que 0.000000, alors que dans le cache la valeur est 0.050000

    Merci d'avance de votre aide

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Ne manque-t-il pas un '&' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(f, "%1.6f", &manger);
    Sinon, le code suivant crée un tableau type d'un seul élément.
    Donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(type,"save/%s.txt",sText);
    peut poser problème.

    Solution : allouer une taille suffisante pour type, genre :PS, après chaque appel à fopen, il faut vérifier que la valeur renvoiée est différente de NULL, ça permet de trouver plus vite la source de certains problèmes.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FILE *f = fopen("toto", mode);
    if(F != NULL) {
        /* utiliser le fichier */
        fclose(f);
    } else {
        /* échec à l'ouverture : on le dit */
        perror("toto");
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Par défaut
    Merci pour cette réponse très précise et commentée.

    J'ai réécris le code mais j'ai toujours la même erreur, cette fois-ci il y a toutes les variables le jeu est un pseudo tamagoshi. Le resultat ne change toujours pas.

    Est-ce que cela peut venir du mode d'ouverture du fichier pour les fscanf?

    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
     
     
       const gchar *sText;
       FILE *f;
       char type[255] ="";
       float manger;
       float dormir;
       float etude;
       float douche;
       float muscu;
       float asso;   
     
        manger=0;
        asso=0;
        etude=0;
        muscu=0;
        dormir=0;
        douche=0;
     
    if(f != NULL) {
     
        f = fopen("cache/manger.txt","w");
        fscanf(f, "%1.6f", &manger);
        fclose(f);
        }
    else {
        /* échec à l'ouverture */
        perror("cache/manger.txt");
    }
     
    if(f != NULL) {
        f = fopen("cache/asso.txt","w");
        fscanf(f, "%1.6f", &asso);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/asso.txt");
    }
     
    if(f != NULL) {
        f = fopen("cache/etude.txt","w");
        fscanf(f, "%1.6f", &etude);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/etude.txt");
    }
    if(f != NULL) {
        f = fopen("cache/muscu.txt","w");
        fscanf(f, "%1.6f", &muscu);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/muscu.txt");
    }
    if(f != NULL) {
        f = fopen("cache/dormir.txt","w");
        fscanf(f, "%1.6f", &dormir);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/dormir.txt");
    }
    if(f != NULL) {
        f = fopen("cache/douche.txt","w");
        fscanf(f, "%1.6f", &douche);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/douche.txt");
    }
    if(f != NULL) {    
        sprintf(type,"save/%s.txt",sText);
        f = fopen(type, "w+");
        fprintf(f,"%1.6f\n%1.6f\n%1.6f\n%1.6f\n%1.6f\n%1.6f",manger,asso,muscu,etude,dormir,douche);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("save/%s.txt");
    }
     
     
     
     
    }

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Attention à l'ouverture :
    Le test sur le success ou non de l'ouverture doit être placé après l'essai d'ouverture :
    1- on essai d'ouvrir
    2- on regarde si ça a fonctionné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FILE *f = fopen("toto", mode);
    if(F != NULL) {
        ....
    }
    Attention aux modes d'ouverture :
    Citation Envoyé par http://man.developpez.com/man3/fopen.3.php
    r
    Ouvre le fichier en lecture. Le pointeur de flux est placé au début du fichier.
    r+
    Ouvre le fichier en lecture et écriture. Le pointeur de flux est placé au début du fichier.
    w
    Ouvre le fichier en écriture. Le fichier est créé s'il n'existait pas. S'il existait déjà, sa longueur est ramenée à 0. Le pointeur de flux est placé au début du fichier.
    w+
    Ouvre le fichier en lecture et écriture. Le fichier est créé s'il n'existait pas. S'il existait deja, sa longueur est ramenée à 0. Le pointeur de flux est placé au début du fichier.
    a
    Ouvre le fichier en ajout (écriture à la fin du fichier). Le fichier est créé s'il n'existait pas. Le pointeur de flux est placé à la fin du fichier.
    a+
    Ouvre le fichier en lecture et ajout (écriture en fin de fichier). Le fichier est créé s'il n'existait pas. Le pointeur de flux est placé à la fin du fichier.
    Dans tu cas, tu devrait remplacer les "w" par des "r", le "w+" par "w" ou "a"

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Par défaut
    J'ai fait ce que tu m'as dit, le résultat est toujours le même le fichier de sauvegarde contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    0.000000
    0.000000
    0.000000
    0.000000
    0.000000
    0.000000

    mon code et maintenant le suivant


    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
     
        const gchar *sText;
       FILE *f;
       char type[255] ="";
       float manger;
       float dormir;
       float etude;
       float douche;
       float muscu;
       float asso;
     
        manger=0;
        asso=0;
        etude=0;
        muscu=0;
        dormir=0;
        douche=0;
     
     
     
    f = fopen("cache/manger.txt","r"); 
     
    if(f != NULL) {
     
        fscanf(f, "%1.6f", &manger);
        fclose(f);
        }
    else {
        /* échec à l'ouverture */
        perror("cache/manger.txt");
    }
     
     
    f = fopen("cache/asso.txt","r");
    if(f != NULL) {
     
        fscanf(f, "%1.6f", &asso);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/asso.txt");
    }
     
     
    f = fopen("cache/etude.txt","r");
    if(f != NULL) {
     
        fscanf(f, "%1.6f", &etude);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/etude.txt");
    }
     
     
    f = fopen("cache/muscu.txt","r");
    if(f != NULL) {
     
        fscanf(f, "%1.6f", &muscu);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/muscu.txt");
    }
     
     
     
    f = fopen("cache/dormir.txt","r");
    if(f != NULL) {
     
        fscanf(f, "%1.6f", &dormir);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/dormir.txt");
    }
     
    f = fopen("cache/douche.txt","r");
    if(f != NULL) {
     
        fscanf(f, "%1.6f", &douche);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("cache/douche.txt");
    }
     
    sprintf(type,"save/%s.txt",sText);
    f = fopen(type, "w+");
     
    if(f != NULL) {    
     
        fprintf(f,"%1.6f\n%1.6f\n%1.6f\n%1.6f\n%1.6f\n%1.6f",manger,asso,muscu,etude,dormir,douche);
        fclose(f);
    }
    else {
        /* échec à l'ouverture */
        perror("save/%s.txt");
    }
     
     
    }
    Le fichier cache/manger.txt est crée par la fonction suivante ( c'est du gtk)
    la fonction suivante marche correctement puisque j'ai le résultat voulu.


    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
     
      /* Condition sur manger */
     
    void
    on_manger_clicked_manger               (GtkButton       *button,
                                            gpointer         user_data)
    {
       float dFraction;
       FILE *f;
       char filename [255];
       char i[30];
       char type[255] ="";    
     
     
       /* Recuperation de la valeur de la barre de progression */
       dFraction = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(button));
     
       dFraction += 0.05;
     
       /* On verifie si l'être n'est pas mort */   
       if (dFraction == 0 )
          mort();
     
       if(dFraction > 1.0)
          dFraction = 1;
     
     
     
       /* Modification de la valeur de la barre de progression */
       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(button), dFraction);
     
     
       /* incrémenter de 1 dans le fichier save.txt, lancer la procésure vérif journée */   
     
       sprintf((char *) &filename,"save.txt");
       f = fopen(filename,"a+");
       if (f) fprintf(f,"%d",1);
       else fprintf(stderr,"Erreur : ne peut pas ouvrir %s\n",filename);
       fclose(f);
     
       /* mettre à jour le cache */
     
         dFraction = gtk_progress_bar_get_fraction(GTK_PROGRESS_BAR(button));  
         sprintf(type,"cache/%s.txt","manger");
         f = fopen(type, "w");
         if (f) fprintf(f,"%1.6f",dFraction);
         else fprintf(stderr,"Erreur : ne peut pas ouvrir %s\n",filename);
         fclose(f);
     
     
     
     
    }

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    As tu vérifié que les fichier était rempli avant de les lire (en effet, le code du second post vidait les fichiers)
    Tu pourrais tu aussi afficher le résultat des lectures des fichiers pour être sur que les valeurs sont bien lues (avec un simple printf ou avec un debogueur)

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Supprime dans tous tes formats de fscanf les 1.6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(f, "%f", &manger);
    etc.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Par défaut
    diogene je t'aime, problème résolu cela fonctionne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion de fichier
    Par Zenol dans le forum C++
    Réponses: 6
    Dernier message: 22/09/2005, 15h44
  2. gestion de fichier à partir d'un formulaire
    Par seb59dk dans le forum Access
    Réponses: 3
    Dernier message: 06/09/2005, 16h52
  3. Fonctions de gestion de fichiers
    Par sebduth dans le forum Fortran
    Réponses: 4
    Dernier message: 22/08/2005, 10h38
  4. [JDOM] Gestion "gros fichiers"
    Par Haazheel dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 17/10/2003, 13h42
  5. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 12h16

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