[C] Remplacer une valeur dans un fichier ...

Fermé
Vidarce Messages postés 6 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 17 août 2010 - 5 janv. 2007 à 11:20
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 9 janv. 2007 à 12:27
bonjour à tous,
j'ai un petit probleme sur un programme que je suis en train de faire.
Je m'expliqe :
Je crée (pour mon cours de C) un petit jeux où je dois enregistrer les meilleurs temps dans un fichier ! Le probleme est que je ne vois pas comment faire pour deplacer le meilleur temps dans mon fichier et supprimer la dernière ligne de ce dernier (car il ne doit y avoir que 5 meilleurs scores dans ce fichier);

Après quelques heures de recherches j'ai reussit (en mode lecture du fichier) a trouvé à quel endroit je devais mettre le nouveau record ! Mais le problème est de savoir comment remplacer cette valeur !!! et déplacer du coup toute les autres !!!

Je tiens a vous préciser que je ne veux pas le code tout fait mais juste des indications me permettant d'avancer :D !

je vous met mon code me permetttant de me situer sur le bon score :

record=fopen("best_record.txt","r");

if(record!=NULL)
{
do
{
fgets(Score,100,record);
sscanf(Score,"%d %lf s",&classement,&temps);
printf("%d %lf\n",classement,temps);
}
while(!feof(record) && (elapsed>temps));
}
fclose(record);

Merci d'avance a tous ceux qui m'aideront !
A voir également:

5 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
5 janv. 2007 à 13:48
Salut.
Moi dans ton cas, je me fait pas chier :
je lis tout et je met dans une variable qui va bien : genre tableau de string.
Ensuite j'effectu la bonne opération sur cette variable (placement du meilleur score, et virer le dernier).
Ensuite, j'écrase tout simplement le fichier de records.
c'est bourrin, mais tant que le fichier n'est pas trop gros.
0
Vidarce Messages postés 6 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 17 août 2010 2
5 janv. 2007 à 14:52
Merci pour ta réponse !
J'y avais pas pensé je dois l'avouer !! Mais par contre, tout mettre dans "genre tableau de string" je comprend pas trop pour être honnete !!
Si tu pouvait être un tout petit peu plus précis, ca me ferait plaisir.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 janv. 2007 à 12:27
un tableau de string, ou tableau de chaine de caractère:
char** ou string[5]
mettons un char** resu;
dans resu[0] tu met la premiere ligne de ton fichier (temps +nom +...)
dans resu[1] l deuxième etc.
ensuite, tu compare ton nouveau temps avec ce qu'il y a dans resu.
metons que tu le mettent en position trois, tu fai :
strcpy(resu[4],resu[3]);
strcpy(resu[3],resu[2]);
strcpy(resu[2],nouveau_record);
Ensuite tu écrit resu dans ton fichier.
0
Je pense que tu ne devrais enregistrer que les meilleurs temps (pas le classement), avec un bon séparateur (genre ';'). Pour faire propre, le classement et le "s" n'ont pas grand chose à faire dans le fichier (séparation données/affichage)

Ensuite tu crée un tableau de float, dans lequel tu mets en premier le nouveau temps à insérer, suivi des 5 temps enregistrés dans le fichier. Ensuite petit exercice de classement du tableau (tri à bulles mon amour), et tu n'as plus qu'à réécrire (écraser) le fichier de sauvegarde avec les 5 meilleurs temps...
Je sais pas si c'est clair ! ^^
0
Vidarce Messages postés 6 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 17 août 2010 2
6 janv. 2007 à 13:32
Merci pour ta réponse bumblebee !
Donc si j'ai bien compris, je met ke les temps ==> je lis mon fichier ou il y a deja des temps, je les met dans un tableau de float, je prend ke les meilleurs temps, je le classe et hop je l'écris dans mon fichier c ca ??

Merci d'avance
0

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

Posez votre question
lirey83 Messages postés 75 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 18 août 2007 13
6 janv. 2007 à 19:12
Cela pourrait donner une fonction ressemblant à ça
bool insert_temps(int temps)
{
  const unsigned int line_size=100;
  const unsigned int nbrecord=5;

  int record[nbrecord];
  int i, temp;
  bool insert = false;

  char Score[line_size];

  // Petite initialisation à -1 par exemple
  for (i=0; i<nbrecord; i++)
    record[i] = -1;

  i = 0;
  FILE *stream = fopen("best_record.txt","rt");
  if (stream != NULL)
  {
    // Récupération des données
    do
    {
      if (fgets(Score, line_size, stream) == NULL) continue; // Fin de fichier
      sscanf(Score,"%d\n",&temp);
      // Insertion meilleur temps
      if (!insert && (temps > temp))
      {
        record[i] = temps;
        insert = true;
        i++;
      }
      if (i<nbrecord)
        record[i] = temp;
      i++;
    }
    while (! feof(stream) && (i<nbrecord));
    fclose(stream);
  }

  // le temps n'a pas été inséré
  if ((i<nbrecord) && !insert)
    record[i] = temps;

  // Ecriture du fichier
  stream = fopen("best_record.txt","wt");
  for (i=0; i<nbrecord; i++)
    if (record[i] != -1)
      fprintf(stream,"%d\n", record[i]);

  fclose(stream);

  return true;
}
:
0