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 :

Système d’enregistrement sur fichier + récupération des donne s’y joueur existe déjà


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Système d’enregistrement sur fichier + récupération des donne s’y joueur existe déjà
    Bonjour voilà ce que j’essayer de faire un système d’enregistrement de score sur fichier(stat) + récupération des donne s’y joueur existe déjà et réécriture

    Donc j’ai code une fonction qui j’espère et bien partie pour faire tout ça,mais le programme plante dans il essaye d'enregistre

    ps: je sais les pointure ne son pas obligatoire j'en n'ai mis pour m’entraîne a les utilise je debut

    voila comment je l'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	printf( "\n\n                   Voulez vous enregistre votre socre\n\n"
                "                   Oui=1\n"
                "                   Non=2\n\n"
                "                   Votre choix ");
        scanf("%d",&enregistre);
     
        switch (enregistre)
            case 1 :
                enregistre_stat(&joueur1,&parite_gagne1,&partie_perdu1,&total_partie);
            break;
    voila la fonction qui fait plante le programme

    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
    void enregistre_stat(char *Pjoueur1,int *Pparite_gagne1,int *Ppartie_perdu1,int *Ptotal_partie)//on envoi a la fonction des pointeur des stat des parties jouer et le nom du joueur
    {
    	FILE* stat = NULL;
    	int stat_enregistre_gagne = 0,stat_enregistre_perdu = 0,stat_enregistre_total_partie = 0;
    	char joueur_enregistre [20]= {0};
    	stat = fopen("stat.txt","r+"); // on ouvre le fichier stat pour lire et ecrire
     
    	if(stat == NULL)
    		{
    			printf(" nous n'avons pas reussi a ouvrire le fichier");
    			return 0;
    		}
     
    	do //on teste si le joueur a deja jouer
        {
            fscanf(stat,"%s",joueur_enregistre);//on récupère le nom des joueurs deja enregistre ligne par ligne
     
    		(strcmp(joueur_enregistre,*Pjoueur1));// on teste
     
        } while(joueur_enregistre != EOF && (strcmp(joueur_enregistre,*Pjoueur1)));//la boucle tour tant qu'une des deux condition ne sont pas remplie
     
     
    	if(strcmp(joueur_enregistre, Pjoueur1))// si oui on recupere c'est stat on y ajoute les nouvelle et on reecrie le tout
    		{
    			fscanf(stat,"%d %d %d",&stat_enregistre_gagne,&stat_enregistre_perdu,&stat_enregistre_total_partie);
     
    			stat_enregistre_gagne = stat_enregistre_gagne  + *Pparite_gagne1;
    			stat_enregistre_perdu = stat_enregistre_perdu + *Ppartie_perdu1;
    			stat_enregistre_total_partie = stat_enregistre_total_partie + *Ptotal_partie;
     
    			fprintf(stat,"%s %d %d %d",*Pjoueur1,stat_enregistre_gagne,stat_enregistre_perdu,stat_enregistre_total_partie);
    		}
    	else// si non on ecrie vu que le "curseur" est a la dernier ligne pas de probleme ?
    		{
    			fprintf(stat,"%s %d %d %d",*Pjoueur1,*Pparite_gagne1,*Ppartie_perdu1,*Ptotal_partie);// si non on ecrie vu que le "curseur" est a la dernier ligne pas de probleme ?
    		}
     
    	fclose(stat);
    merci d'avance pour vos réponses

  2. #2
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 167
    Points
    2 167
    Par défaut
    Nous indiquer où est l'erreur serait grandement appréciable si tu sais où elle est sinon nous donner l'erreur affichée par ton programme serait le minimum.

    Sinon dans enregistre_stat tu passes un char en 2e argument et non pas un pointeur. Mauvaise idée.

    Pour sauvegarder des données sur un programme j'ai tendance à préférer sqlite que de tout écrire dans un fichier. Ça permet entre autre d'éviter d'avoir à vérifier si chaque info est valide. Je te conseille d'y jeter un coup d'oeil, ça pourrait te faciliter la vie.

    PS: man strcmp

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    je n'ai pas de message d'erreur Windows m'affiche juste

    "un problème a fait que le programme a cessé de fonctionner correctement. Windows va fermer ce programme et vous indiquer si une solution est disponible"

    voila le message d'erreur, la compilation se passe bien donc je ne sais même pas sur que ligne sa plante, je sais juste que sa plante quand j'essaye de rentre dans cette fonction

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    Bonjour à toi!

    Ma première réaction à vif.
    Pourquoi tant de haine pointeurs? Que pense-tu de la signature suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* renvoie 1 en cas de succès, 0 sinon */
    int enregistre_statJoueur(const char * nom, int victoires, int défaites, int parties);
    Après avoir lu ton code en détail
    Ton code est mal géré, il faut que tu gardes les stats dans une structure vivante (dans le programme), pas morte (enterrée au fond d'un fichier)

    Tu devrais avoir une structure d'aide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct stat_joueur {
        const char* nom;
        int parties, victoires, defaites;
    };
    Le flux de données serait alors:
    1. demande du nom du joueur
    2. détection du fichier de sauvegarde
    3. lecture dans un stat_joueur si présent
    4. jeu
    5. sauvegarde: ecriture sans réflexion du stat_joueur dans la sauvegarde


    la sauvegarde ne devrait pas lire le fichier.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    leternel en gros je refait la fonction en deux partie ?
    une a début qui li si le joueur existe, récupéré les donne
    on joue
    deuxième fonction, on sauvegarde les donne

    ps je ne pas de haine contre les pointeur mais bon si je pouvais m'en passe

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    L'idée est bien de lire les données avant, et d'écrire après.

    j'imagine les fonctions suivantes:
    stat_joueur charger(const char[] nomJoueur);
    int sauvegarder(stat_joueur stats);

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    petit question voila j'ai réussi a lire au début de la partie les donne enregistre si le joueur a deja joueur

    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
    void recup_stat(stat_joueur *stat)//on envoi a la fonction des pointeur pour modifie les variable si deja jouer
    {
    	FILE* stat_doc = NULL;
    	char joueur_enregistre [20]= {0};
    	stat = fopen("stat_doc.txt","r"); // on ouvre le fichier stat pour lire et ecrire
     
    	if(stat == NULL)
    		{
    			printf(" nous n'avons pas reussi a ouvrire le fichier");
    			return 0;
    		}
     
    	do //on teste si le joueur a deja jouer
        {
            fscanf(stat,"%s",joueur_enregistre);//on récupère le nom des joueurs deja enregistre ligne par ligne
     
    		(strcmp(joueur_enregistre,stat->joueur1));// on teste
     
        } while(joueur_enregistre != EOF && (strcmp(joueur_enregistre,stat->joueur1)));//la boucle tour tant qu'une des deux condition ne sont pas remplie
     
     
    	if(strcmp(joueur_enregistre,stat->joueur1))// si oui on recupere c'est stat
    		{
    			fscanf(stat,"%d %d %d",stat->victoires,stat->defaites,stat->parties);
    		}
        fclose(stat);
    }
    comme vous pouvais le voir je ferme le fichier a la fin de la fonction

    la question est : quand je vais ouvrir le fichier a la fin du jeu est ce que je suis oblige de retrouve ma ligne avec une boucle ou l'ordi a "sauvegarde" la ligne et enregistrera en ecrasent cette dernier ?

    j’espère avoir était clair merci de votre réponse

  8. #8
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    la ligne n'est pas sauvegardée.
    par contre, il y a une fonction fseek pour se déplacer dans le fichier.

    Si ta sauvegarde à toujours la meme taille, tu peux trouver la bonne ligne en sautant directement dessus (ou par "ligne")

    un fichier ne contient pas vraiment de ligne, seulement une unique chaine de caractère, contenant des '\n'.

    Bonne continuation

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    merci pour ta réponse je vais refaire une boucle car la fonction fseek je sais pas encore bien l'utilise ^^

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baptiste91 Voir le message
    merci pour ta réponse je vais refaire une boucle car la fonction fseek je sais pas encore bien l'utilise ^^
    Salut
    Il y a le man pour ça fseek(fp, position, origine).
    • Si l'origine est à SEEK_SET, alors la position sera en absolu => fseek(fp, 120, SEEK_SET) te place directement sur l'octet 120 du fichier
    • Si l'origine est à SEEK_CUR, alors la position sera en relatif par rapport à la position actuelle => fseek(fp, -5, SEEK_CUR) te fait reculer de 5 caractères
    • Si l'origine est à SEEK_END, alors la position sera prise par rapport à la fin du fichier => fseek(fp, 50, SEEK_END) te place 50 caractères avant la fin du fichier


    Si tu prends le parti de sauvegarder ta structure d'un coup via un fwrite(), et que ta structure a une taille figée (en gros pas de pointeurs), alors chaque enregistrement aura une taille de "sizeof(ta_structure)" octets et tu pourras passer directement au nième enregistrement en faisant un fseek(fp, n * sizeof(structure), SEEK_SET)...

    Attention toutefois, avec cette méthode ton fichier ne sera réutilisable que sur un ordi ayant la même architecture car les compilos insèrent des octets "bidons" entre les champs d'une structure pour optimiser les accès mais ce remplissage dépend fortement de l'architecture et de l'os. Et donc ta "sauvegarde" (qui contiendra aussi ces octets "bidons") ne pourra pas être envoyée sur un autre ordi car même avec le même programme, il y a un risque qu'elle ne soit pas lisible (les octets "bidons" pouvant ne pas se trouver au même endroit sur l'autre ordi)...

    Citation Envoyé par baptiste91 Voir le message
    ps je ne pas de haine contre les pointeur mais bon si je pouvais m'en passer
    Ben justement c'était la question de leternel qui te demandait pourquoi tu passes des pointeurs sur les scores à la fonction alors que la valeur du score suffit pour que la fonction le récupère et l'enregistre...

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    merci pour la leçon je vais voir tout ça, mais dans le future je ne serai pas ou se situ la sauvegarde x parmi une dix-senne de ligne car si le joueur x est le 3eme joueur a joue ça sera la ligne 3, mais si c'est le 5eme joueur a s enregistre il sera en 5eme position comment programme ça avec fseek ?? je suis un peut oblige d’aller cherche la ligne en comparent le nom dans une boucle non ??

    pour les pointeur a ce que j'ai compris une fonction fait une copie des variable que tu lui envoie est la supprime a la fin ? donc quand je vais cherche les scores je suis oblige d'envoie des pointeur ?? car je peut pas renvoyer plusieurs valeur a mon main avec juste une fonction ??

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baptiste91 Voir le message
    merci pour la leçon je vais voir tout ça, mais dans le future je ne serai pas ou se situ la sauvegarde x parmi une dix-senne de ligne car si le joueur x est le 3eme joueur a joue ça sera la ligne 3, mais si c'est le 5eme joueur a s enregistre il sera en 5eme position comment programme ça avec fseek ?? je suis un peut oblige d’aller cherche la ligne en comparent le nom dans une boucle non ??
    Là oui. fseek() ne se justifie que si tu sais déjà où chercher...

    Citation Envoyé par baptiste91 Voir le message
    pour les pointeur a ce que j'ai compris une fonction fait une copie des variable que tu lui envoie est la supprime a la fin ?
    Exact (il en va d'ailleurs de même pour la zone qui reçoit le pointeur dans le cas où tu passes un pointeur à une fonction). Mais si la valeur en question a été enregistrée dans un fichier entre temps, ça n'a plus d'importance...

    Citation Envoyé par baptiste91 Voir le message
    donc quand je vais cherche les scores je suis oblige d'envoie des pointeur ??
    car je peut pas renvoyer plusieurs valeur a mon main avec juste une fonction
    Citation Envoyé par baptiste91 Voir le message
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    enregistre_stat(&joueur1,&parite_gagne1,&partie_perdu1,&total_partie);
    ??
    Leternel parlait de la fonction qui enregistre les stats, donc celle qui a pour but de stocker les stats dans un fichier. Celle-là, elle n'a pas besoin de recevoir des pointeurs. Exactement comme pour printf() qui n'a pas besoin des pointeurs pour afficher ses valeurs.
    C'est sûr que si tu as besoin de récupérer dans une fonction X des valeurs issues d'une fonction Y, alors la fonction Y devra recevoir les adresses des zones où stocker les variables. Exactement comme pour scanf().

    Maintenant, plutôt que de passer 4 variables, je verrais bien un regroupement de ces variables dans une entité adaptée => une structure. Ainsi les fonctions de sauvegarde et de restauration n'auraient plus qu'un seul paramètre à recevoir: la structure et grâce à ce paramètre les fonctions auraient quand-même accès aux éléments du joueur.

    Dans ce cas, contrairement à ce que j'ai dit jusqu'ici, il faudrait quand-même passer une adresse à la fonction de sauvegarde. Non pas dans un but de récupérer quoi que ce soit mais juste dans un but de rapidité. En effet, une fonction recevant toujours une copie de l'élément qu'on lui passe, il est plus rapide de copier une simple adresse (2 ou 4 octets) que recopier les X octets d'une structure...

    Et accessoirement ça rendrait ton code plus souple (les modifs de tes joueurs seraient centralisés dans ta structure sans trop d'impact sur les fonctions)

    Exemple
    Code cpp : 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
    typedef struct {
        char nom[20];                // Le nom
        unsigned int gain;           // Nb parties gagnées
        unsigned int perte;         // Nb parties perdues
    } t_joueur;
     
    int sauvegarde (t_joueur *joueur, char *fichier)
    {
        FILE *fp;
        int ret;
     
        fp=fopen(fichier, "ab");
        if (fp == NULL) return 0;
     
        ret=fwrite(joueur, sizeof t_joueur, 1, fp);
        fclose(fp);
        return ret;
    }
     
    int main()
    {
        t_joueur joueur;
        if (sauvegarde(&joueur, "/tmp/svg.dat") != 0)
            printf("sauvegarde ok\n");
        else
            printf("problème - la sauvegarde a échoué\n");
    }

  13. #13
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    Supposons que tu puisse dire quelle est la taille d'une sauvegarde;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int SAVE_SIZE = 12 /*nom */ + 3 /*code camp*/ + /*...*/ +1 /*\n*/;
    alors pour trouver la septième sauvegarde, il suffit d'utiliser fseek(SEEK_SET, 7 * SAVE_SIZE);

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    merci pour votre aide et conseille, même si a mon niveau il y a des subtilité de codage que je ne saisi pas bien encore, mais bon ça viendra c'est en forgent qu on devient forgeront ^^ maintenant au travaille, encore merci a vous

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    aaaaaaaaaaahhhhh

    bon voila j'ai code ma deuxième fonction qui est sensée écrie les score a la fin du programme juste âpre la boucle du choix quitte jeu normale on enregistre que si on quitte le jeu ^^ mais si encore la fonction écrivais

    car voula ce qui ce passe 1ex:le fichier stat_doc.txt est vide

    la compilation ce passe bien le programme ce lance jusqu'au première instruction qui est quelle est le nom du joueur ? : je rentre "bap" la on a le choix mode solo ou multi je choisi le solo est le sa ne plante pas c'est juste que le programme fait une sorte de pause arrive a la fonction recup_stat a mon avis ce un boucle infini ??? elle devrai normalement s’arrête direct arrive a EOF ?

    ex 2 : le fichier stat_doc.txt est remplie (bap 3 5 8) je vais direct ecrire dedans

    je lance le programme tout ceux passe bien sauf que la fonction recup_stat ne récupéré rien est la fonction enregistre_stat ecrie rien les fichier stat_doc n'a pas bouge ???

    je comprend vraiment plus rien pourtant j'ai cru bien fait, je vous passe les fichiers en plus d'afficher les deux fonction merci d'avance pour votre aide

    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
    void recup_stat(stat_joueur *stat)//on envoi a la fonction des pointeur pour modifie les variable si deja jouer
    {
    	FILE* stat_doc = NULL;
    	char joueur_enregistre [20]= {0};
    	stat_doc = fopen("stat_doc.txt","r"); // on ouvre le fichier stat pour lire
     
    	if(stat_doc == NULL)
    		{
    			printf(" nous n'avons pas reussi a ouvrire le fichier");
    			return 0;
    		}
     
    	do //on teste si le joueur a deja jouer
        {
            fscanf(stat_doc,"%s",joueur_enregistre);//on récupère le nom des joueurs deja enregistre ligne par ligne
     
    		(strcmp(joueur_enregistre,stat->joueur1));// on teste
     
        } while(joueur_enregistre != EOF && (strcmp(joueur_enregistre,stat->joueur1)));//la boucle tour tant qu'une des deux condition ne sont pas remplie
     
     
    	if(strcmp(joueur_enregistre,stat->joueur1))// si oui on recupere c'est stat
    		{
    			fscanf(stat_doc,"%d %d %d",stat->victoires,stat->defaites,stat->parties);
    		}
        fclose(stat_doc);
    }
     
    void enregistre_stat(stat_joueur stat)
    {
        FILE* stat_doc = NULL;
        char joueur_enregistre [20]= {0};
        stat_doc = fopen("stat_doc.txt","r+"); // on ouvre le fichier stat pour lire et ecrire
     
        if(stat_doc == NULL)
    		{
    			printf(" nous n'avons pas reussi a ouvrire le fichier");
    			return 0;
    		}
     
    	do //on teste si le joueur a deja jouer
        {
            fscanf(stat_doc,"%s",joueur_enregistre);//on récupère le nom des joueurs deja enregistre ligne par ligne
     
    		(strcmp(joueur_enregistre,stat.joueur1));// on teste
     
        } while(joueur_enregistre != EOF && (strcmp(joueur_enregistre,stat.joueur1)));//la boucle tour tant qu'une des deux condition ne sont pas remplie
     
    	if(strcmp(joueur_enregistre,stat.joueur1))// si oui on recupere c'est stat
    		{
    			fprintf(stat_doc,"%s %d %d %d",stat.joueur1,stat.victoires,stat.defaites,stat.parties);
    		}
        else
            {
                fprintf(stat_doc,"%s %d %d %d",stat.joueur1,stat.victoires,stat.defaites,stat.parties);
            }
     
    }
    Fichiers attachés Fichiers attachés
    • Type de fichier : c main.c (13,0 Ko, 429 affichages)
    • Type de fichier : h dico.h (376 octets, 55 affichages)
    • Type de fichier : c dico.c (3,8 Ko, 1053 affichages)

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par baptiste91 Voir le message
    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
    void recup_stat(stat_joueur *stat)//on envoi a la fonction des pointeur pour modifie les variable si deja jouer
    {
    	FILE* stat_doc = NULL;
    	char joueur_enregistre [20]= {0};
    	stat_doc = fopen("stat_doc.txt","r"); // on ouvre le fichier stat pour lire
     
    	do //on teste si le joueur a deja jouer
        {
            fscanf(stat_doc,"%s",joueur_enregistre);//on récupère le nom des joueurs deja enregistre ligne par ligne
     
    		(strcmp(joueur_enregistre,stat->joueur1));// on teste
     
        } while(joueur_enregistre != EOF && (strcmp(joueur_enregistre,stat->joueur1)));//la boucle tour tant qu'une des deux condition ne sont pas remplie
        fclose(stat_doc);
    }
    ... c'est juste que le programme fait une sorte de pause arrive a la fonction recup_stat a mon avis ce un boucle infini ??? elle devrai normalement s’arrête direct arrive a EOF ?
    Ben certainement... si la fonction utilisée pour lire le fichier renvoyait EOF. Or fscanf() ne renvoie pas EOF mais le nombre d'éléments récupérés (donc 0 si elle ne récupère rien parce qu'elle est arrivée en fin de fichier). Faut aussi lire les docs de temps en temps.

    De plus, tu n'utilises même pas la valeur renvoyée par fscanf() mais la variable joueur_enregistre remplie par fscanf(). Tu as cumulé les erreurs donc c'est normal que rien ne fonctionne.

    Accessoirement si joueur_enregistre valait EOF (-1) je me demande comment se comporterait le strcmp() du dessus (figure de réthorique car je sais parfaitement comment se comportera strcmp(EOF, ...)).

    La méthode générale pour lire et chercher dans un fichier est la suivante
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((valeur=fonction_de_lecture(fichier)) != valeur_speciale)
    {
        traitement de valeur
    }
    Ce qui évite d'appliquer le traitement sur la valeur si celle-ci est dans le cas particulier "fin de fichier".
    Et si la fonction de lecture remplit une variable qu'elle reçoit (comme le fait fscanf()) alors tu n'as pas besoin de stocker ce que te renvoie la fonction
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (fscanf(fp, &truc, &chose) != 0)
    {
        traitement de truc et chose
    }

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    ok note merci pour ton aide je vais corrige tout ça et relire les cours ^^

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    bonjour voila j'ai corrige mais erreur et fait quelque teste:
    je teste le contenu de mais variable avec des printf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	printf("%s",joueur_enregistre);
            printf("\n%d\n",I);
            printf("\n%d\n",I1);
    sur-ce quand je teste c'est variable elle m'affiche le contenu a chaque tour de la boucle.
    arrêt-on nous sur I1 car au résultat de mais test les variable joueur_enregistre et I fond bien leur travaille pas de souci I s arrête bien a la fin du fichier et joueur_enregistre récupéré bien les nom mais si entre deux nom elle fait trois tour pour récupéré les points de victoire, défaites et partie mais c'est pas grave car elle ne serons j aime égale a joueur1.

    par contre I1 récupéré la valeur du strcmp voir-ci joint

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I1 = strcmp(joueur_enregistre,stat->joueur1);
    cette dernier n arrete pas la boucle quand elle est a zéro (vrai) est ne va pas dans mon else (faux car = 0) car je l'utilise comme un booléen

    la question est pourquoi j'ai est réfléchie, regarde les tuto est je ne comprend vrai pas car je la voie a zéro grasse a mais printf

    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
    void recup_stat(stat_joueur *stat)//on envoi a la fonction des pointeur pour modifie les variable si deja jouer
    {
    	FILE* stat_doc = NULL;
    	int I = 0,I1 = 0;
    	char joueur_enregistre [20]= {0};
    	stat_doc = fopen("stat_doc.txt","r"); // on ouvre le fichier stat pour lire
     
    	if(stat_doc == NULL)
    		{
    			printf(" nous n'avons pas reussi a ouvrire le fichier");
    			return 0;
    		}
     
    	do //on teste si le joueur a deja jouer
        {
            I = fgetc(stat_doc);
            fscanf(stat_doc,"%s",joueur_enregistre);//on récupère le nom des joueurs deja enregistre ligne par ligne
            I1 = strcmp(joueur_enregistre,stat->joueur1);
     
    		printf("%s",joueur_enregistre);
            printf("\n%d\n",I);
            printf("\n%d\n",I1);
     
        } while( I != EOF && I1 == 0);//la boucle tour tant qu'une des deux condition ne sont pas remplie
     
    	if( I1 )// si oui on affiche le massage
            {
                printf(" vous avez encore jamais enregistre de score ");
            }
        else // si non on recupere c'est stat
    		{
    			fscanf(stat_doc,"%d %d %d",stat->victoires,stat->defaites,stat->parties);
    			printf(" %s a deja gagne %d partie, perdu %d partie sur %d partie",stat->joueur1,stat->victoires,stat->defaites,stat->parties);
    		}
        fclose(stat_doc);
    }
    merci d'avance pour votre réponse

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/04/2011, 13h43
  2. Réponses: 6
    Dernier message: 20/01/2008, 16h32
  3. Récupération des données d'un fichier .txt
    Par vincou dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/07/2007, 10h55
  4. Récupération des données après restauration du système avec Ghost
    Par digital prophecy dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 12/06/2007, 14h05
  5. [MySQL] problème de syntaxe sur la récupération des données
    Par soshin dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 23/11/2006, 12h34

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