Remplir un tableau à partir d'un fichier et l'inverse aussi
pOw4_Amecpie
Messages postés
548
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
En gros j'ai sur un fichier texte des 5 meilleurs scores enregistrés, quand le joueur fait un meilleur score, je dois mettre à jour la liste des 5 meilleurs scores.
Mon idée :
Il faudrait que je code une fonction qui :
=>stocke dans un tableau les 5 nombres qui sont inscrit sur un fichier texte
=>je fais les modifications nécessaire dans le tableau
=>j'ecris sur le fichier texte le contenu de mon tableau modifié ( sans garder l'ancien contenu )
pour l'instant j'ai fait ça mais j'ai l'impression que mon problème vient du remplissage du tableau à partir des valeurs lues sur le fichier texte.
un petit coup de main ne serait pas de refus, merci :)
En gros j'ai sur un fichier texte des 5 meilleurs scores enregistrés, quand le joueur fait un meilleur score, je dois mettre à jour la liste des 5 meilleurs scores.
Mon idée :
Il faudrait que je code une fonction qui :
=>stocke dans un tableau les 5 nombres qui sont inscrit sur un fichier texte
=>je fais les modifications nécessaire dans le tableau
=>j'ecris sur le fichier texte le contenu de mon tableau modifié ( sans garder l'ancien contenu )
pour l'instant j'ai fait ça mais j'ai l'impression que mon problème vient du remplissage du tableau à partir des valeurs lues sur le fichier texte.
void enregistrer_score(int score){ FILE* fichier_score; fichier_score = fopen("C:\\score.txt","w+"); if(fichier_score==NULL){ fprintf( stderr, "Erreur fichier en lecture !\n" ); exit( EXIT_FAILURE); } char ch[1]; int i; int tableau_score[5]; // on remplit le tableau de 0 for(i=0;i<5;i++){ tableau_score[i] = 0; } // on remplit le tableau avec les valeurs du fichier des scores for(i=0;i<5;i++){ fgets(ch,1,fichier_score); tableau_score[i] = (int)ch[0]; } // affiche contenu du tableau for(i=0;i<5;i++){ printf("%d ",tableau_score[i]); } // on ferme le fichier fclose(fichier_score); // on cherche quel est le plus petit score int score_min = tableau_score[0]; for(i=1;i<5;i++){ if(tableau_score[i]<score_min){ score_min = tableau_score[i]; } } // on compare le score actuel avec le score minimum enregistrer // puis on le remplace dans le tableau bool ok=true; if(score>score_min){ for(i=0;i<5 && ok;i++){ if(tableau_score[i]==score_min){ tableau_score[i] = score; ok=false; // le booleen sert de securite, si par exemple il y a 3 memes chiffres minimum, on en remplace qu'un seul } } } // on réouvre le fichier en mode ecriture // puis on ecrit le contenu du tableau de score fichier_score = fopen("C:\\score.txt","w"); for(i=0;i<5;i++){ fprintf(fichier_score,"%d\n",tableau_score[i]); } fclose(fichier_score); }
un petit coup de main ne serait pas de refus, merci :)
A voir également:
- Remplir un tableau à partir d'un fichier et l'inverse aussi
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier bin - Guide
- Creer un groupe whatsapp a partir d'un autre groupe - Guide
- Tableau word - Guide
9 réponses
salut
tu peux essayer
car le cast ne convertit pas ton caractère en int mais récupère la valeur entière.
après il serai plus simple de gérer tes scores dans un tableau trié pour obtenir une pile mais c'est juste un avis, ca changera rien par rapport à ton pb.
naga
tu peux essayer
for(i=0;i<5;i++){ fgets(ch,1,fichier_score); tableau_score[i] = (int)ch[0] - 48; }
car le cast ne convertit pas ton caractère en int mais récupère la valeur entière.
après il serai plus simple de gérer tes scores dans un tableau trié pour obtenir une pile mais c'est juste un avis, ca changera rien par rapport à ton pb.
naga
oy !
donc si le score peu être 10 , le fgets est mauvais car il ne prendra que 1 caractère, et il y en a 2 (le '1' et le '0').
Ensuite, si tu te réfère à la table ascii, tu vois que les caractères numériques commencent à partir de 48, soit :
caractère = '0' => valeur entière = 48
donc si tu lis le caractère '5' (=> valeur entière : 53) et que tu souhaite récupérer une valeur numérique égale à 5, il faut lui soustraire 48 (ou le caractère '0').
cependant si tu veux avoir un score allant jusque 255, tu peux cette 'astuce', sachant qu'un caractère peu avoir 256 valeurs différentes (0 y compris)
donc si le score peu être 10 , le fgets est mauvais car il ne prendra que 1 caractère, et il y en a 2 (le '1' et le '0').
Ensuite, si tu te réfère à la table ascii, tu vois que les caractères numériques commencent à partir de 48, soit :
caractère = '0' => valeur entière = 48
donc si tu lis le caractère '5' (=> valeur entière : 53) et que tu souhaite récupérer une valeur numérique égale à 5, il faut lui soustraire 48 (ou le caractère '0').
cependant si tu veux avoir un score allant jusque 255, tu peux cette 'astuce', sachant qu'un caractère peu avoir 256 valeurs différentes (0 y compris)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
hmm ça a pas l'air de fonctionner,
si a la base dans mon fichier texte j'ai par exemple ceci :
9
5
0
3
1
si je fais une partie et que je fais un score de 5, je retrouve mon fichier texte avec :
5
0
0
0
0
alors que ça aurait du remplacer seulement le 0 par 5
et avec ta méthode j'ai le meme probleme sauf qu'a la place des 0, y'a ecrit -48
je comprends pas
si a la base dans mon fichier texte j'ai par exemple ceci :
9
5
0
3
1
si je fais une partie et que je fais un score de 5, je retrouve mon fichier texte avec :
5
0
0
0
0
alors que ça aurait du remplacer seulement le 0 par 5
et avec ta méthode j'ai le meme probleme sauf qu'a la place des 0, y'a ecrit -48
je comprends pas
essayer déjà d'écrire une valeur dans un fichier (juste UN int. => tu ouvre ton fichier, t'écrit, tu ferme, tu ouvre, tu lit, tu ferme, t'affiche) ?
ensuite dans ta lecture tu récupère le score minimal alors que c'est l'indice dans ton tableau qui t'intéresse.
il te faudra par exemple une fonction :
qui te renvoi ton indice et la valeur minimum.
ensuite une fonction
qui te rempli ton tableau
puis une fonction
qui écrira ton fichier avec les valeurs dans tableau.
test déjà la première partie, soit ecrire une valeur et la récupérer, avant quoi que ce soit d'autre.
de même je continue de penser qu'il faudrai trier ton tableau pour que la gestion du score soit plus facile.
ensuite dans ta lecture tu récupère le score minimal alors que c'est l'indice dans ton tableau qui t'intéresse.
il te faudra par exemple une fonction :
int chercheMini(int* tableau, int* valeurRetour)
qui te renvoi ton indice et la valeur minimum.
ensuite une fonction
int* lireFic(char * nomFichier)
qui te rempli ton tableau
puis une fonction
void ecrireFichier(int* tableau, char* nomFichier)
qui écrira ton fichier avec les valeurs dans tableau.
test déjà la première partie, soit ecrire une valeur et la récupérer, avant quoi que ce soit d'autre.
de même je continue de penser qu'il faudrai trier ton tableau pour que la gestion du score soit plus facile.
J'ai inscrit une valeur dans mon fichier manuellement, j'essaie donc de la stocker dans le tableau puis de l'afficher mais rien ne marche.
Peut etre qu'un tableau dynamique serait mieux ? ou le tableau statique est aussi bien adapté ?
Pour les fonctions je les ferais plus tard, je découperais ma grosse fonction en petites comme tu l'a mentionné plus haut.
Apres je pense que tu as raison pour trier le tableau, je ferais une fonction pour ça quand j'aurais résolu le probleme.
Je continu de chercher et de faire des tests, en tout cas merci de ton aide :)
Peut etre qu'un tableau dynamique serait mieux ? ou le tableau statique est aussi bien adapté ?
Pour les fonctions je les ferais plus tard, je découperais ma grosse fonction en petites comme tu l'a mentionné plus haut.
Apres je pense que tu as raison pour trier le tableau, je ferais une fonction pour ça quand j'aurais résolu le probleme.
Je continu de chercher et de faire des tests, en tout cas merci de ton aide :)
pas de problèmes.
un exemple pour lire ton fichier et récupérer les hauts scores :
et pour récupérer le mini et son indic :
par contre j'ai pas de compilateur sur mon pc donc j'ai pas peu tester. T'auras peu être des corrections à faire.
Sinon mieux vaut pour le moment rester sur un tableau de taille statique, c'est plus facile à gérer (ca va grave te compliqué la vie sinon, donc on verra après).
un exemple pour lire ton fichier et récupérer les hauts scores :
int* lireFic(char * nomFichier) { int tabRetour[5];//tu peux rendre dynamique si ca te tente FILE* fichier_score = fopen("C:\\score.txt","r+");//la lecture suffit ici if (fichier_score ==NULL) {fputs ("File error",stderr); exit (1);}* char caract = ''; int indic = 0 do { caract = fgetc(fichier_score );// On lit le caractère if(caract != '\n' && caract != '\0' ) si c'est un score; { tabRetour[indic]=((int)caract)-48; indic = indic +1; } } while (caract != '\0') && (indic != 5); // on lit jusque la fin ou quand tu as déjà 5 scores fclose(fichier_score); return tabRetour; }
et pour récupérer le mini et son indic :
int chercheMini(int* tableau, int* valeurRetour) { int valMin=11; int indice=0; int nbElem=sizeOf(tableau)/sizeof(int); int tscore = 11; int i = 0; for(i=0;i<nbelem;i++) { if( tableau[i] < valMin) { valmin=tableau[i]; indice=i; } } valeurRetour = &valmin; return indice; }
par contre j'ai pas de compilateur sur mon pc donc j'ai pas peu tester. T'auras peu être des corrections à faire.
Sinon mieux vaut pour le moment rester sur un tableau de taille statique, c'est plus facile à gérer (ca va grave te compliqué la vie sinon, donc on verra après).