Probléme avec la sauvegarde sur C (Fichier...

Fermé
jacked - 23 déc. 2008 à 14:21
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 23 déc. 2008 à 22:52
Bonjour,

je voudrai faire un programme sur "C" qui compte le nombre de fois que le programme est
exécuté , pour ça j'ai utiliser la ( lecture / écriture) dans les fichier avec une variable "compteur" qui s'incrémente
chaque foi que le programme est exécuté . mais sa ne marche pas !

si quelqu'un a une idée , merci de me faire part de votre connaissance .
A voir également:

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 déc. 2008 à 14:37
Salut,
Je pense que l'erreur vient de ton code ;). Donc si tu pouvais le poster (utilise la balise de code, à droite de souligner pour la lisibilité), on pourrait sûrement t'aider.
Cdlt
0
sayé je poster le code
0
oui voila :

#include <cstdlib> 
#include <iostream>
using namespace std ;
 

int main(int argc, char *argv[])
{

   FILE* fichier = NULL;
   long compteur=0;
      
   fichier = fopen("save.sys", "w"); 
  
   if   (fichier != NULL)
    {
        fscanf(fichier, "%ld", compteur); 
        compteur++ ;
        fprintf(fichier, "%ld ",compteur);
            
        
        fclose(fichier);
    }  
    system("pause");   
    return (0);
}

0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 déc. 2008 à 15:22
Normal que ça ne marche pas, tu cherches à lire dans un fichier ouvert en écriture seulement. Et t'as aussi oublié dans fscanf ne passer le pointeur. Et enfin, il faut replacer l'indicateur de position de flux en début de fichier avant de récrire.
Ce qui donne :
#include <cstdlib> 
#include <iostream>
using namespace std ;


int main(int argc, char *argv[])
{

    FILE* fichier = NULL;
    long compteur=0;

    fichier = fopen("save.sys", "w+"); 

    if   (fichier != NULL)
    {
        fscanf(fichier, "%ld", &compteur); 
        fseek(fichier,0,SEEK_SET);
        compteur++ ;
        fprintf(fichier, "%ld",compteur);

        fclose(fichier);
    }  
    return 0;
}


De plus, dans ton programme tu mélanges C et C++. Ce qui n'est pas très bon. Par exemple tu utilises iostream (C++) au lieu de stdio.h (C). Même remarque pour stdlib.h.
Cdlt
0
déja merci pour ta réponce , mais sa ne marche pas aussi , le compteur réste sur 0 si en veu l'afficher
et pour la fonction : fseek(fichier,0,SEEK_SET);

elle fait quoi ? ,et je croi pas qu'elle est néssécére !.
et pour les lib <iostream> c'est vrais que je mélange c et cpp mais je ne risque pas de confondre .
enfin j'voulé juste te remercier pour ta réponce et te demmander si tu pouvé juste dévlopé un peu sur
la fonction :fseek(fichier,0,SEEK_SET);
elle sére a quoi ?!!!! , et le code ne change pas le compteur réste sur "0" .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 déc. 2008 à 22:52
Oups, j'ai fait une boulette dans mon code. Le droit n'est pas "w+" mais "r+".
Voici, ce que ça donne (avec stdio.h et stdlib.h)
#include <stdio.h> 
#include <stdlib.h>

int main(void) {
    FILE* fichier = NULL;
    long compteur=0;

    fichier = fopen("save.sys", "r+"); 

    if   (fichier != NULL)  {
        fscanf(fichier, "%ld", &compteur); 
        fseek(fichier,0,SEEK_SET);
        compteur++ ;
        fprintf(fichier, "%ld",compteur);

        fclose(fichier);
        fichier=NULL;
    }

    return 0;
}

Sinon, si fseek(fichier,0,SEEK_SET); tu en as besoin dans ton code. En fait, ça te permet de repositionner l'indicateur de position en début de fichier. Lors de ton fscanf, tu vas lire le nombre, ce qui va déplacer cet indicateur à la fin du nombre. Si tu écris immédiatement avec fprintf, tu placeras un nombre à côté et non à la place. Donc ton fichier contiendra : 0, puis 01, puis 012, etc.
D'ailleurs, à la place de fseek(fichier,0,SEEK_SET), tu aurais pu mettre tout simplement rewind(fichier); Ca fait exactement la même chose, mais c'est plus court ^^.
0