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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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
    Membre averti
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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
    Membre averti
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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
    Membre averti
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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

+ 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