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 -
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.

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:

9 réponses

Utilisateur anonyme
 
salut

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
0
Utilisateur anonyme
 
ah et aussi : ton score est entre 0 et 9 seulement? sinon il faut revoir ta manière de les lire
0
pOw4_Amecpie Messages postés 548 Date d'inscription   Statut Membre Dernière intervention   37
 
Merci pour ton aide ;)
ça fait quoi le - 48 ?
Le score peut etre au maximum 10
0
Utilisateur anonyme
 
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)
0

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

Posez votre question
pOw4_Amecpie Messages postés 548 Date d'inscription   Statut Membre Dernière intervention   37
 
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
0
Utilisateur anonyme
 
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 :
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.
0
Utilisateur anonyme
 
ah et une autre chose, il faudrai que tu lise ton fichier, ca peu servir ^^ (là tu initialize à 0)
0
pOw4_Amecpie Messages postés 548 Date d'inscription   Statut Membre Dernière intervention   37
 
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 :)
0
Utilisateur anonyme
 
pas de problèmes.
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).
0