Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1811 connectés 

  FORUM HardWare.fr
  Programmation
  C

  lire seconde ligne d'un fichier avec fgets en c

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

lire seconde ligne d'un fichier avec fgets en c

n°2044862
key94
Posté le 28-12-2010 à 18:27:11  profilanswer
 

Bonsoir,
 
Je suis en train de me faire un petit jeu en c avec SDL comportant differents niveaux. J'ai mis chaque niveau par ligne (ACSII) dans un fichier que j'ai nommé niveaux.lvl.
 
Mon soucis est que je ne sais pas comment faire pour lire la deuxieme ligne du fichier niveaux.lvl afin de commencer au niveau 2 et non par le niveau 1.
 
Pour charger un niveau je fais

Code :
  1. int chargerNiveau(int niveau[][NB_BLOC_HAUTEUR])
  2. {
  3.     FILE* fichier = NULL;
  4.     char ligneFichier[NB_BLOC_LARGEUR * NB_BLOC_HAUTEUR + 1] = {0};
  5.     int i = 0, j = 0;
  6.     fichier = fopen("/media/MacOs/prog/c/Marion Sokoban/niveaux.lvl", "r" );
  7.     if (fichier == NULL)
  8.         return 0;
  9.     //ON lit la ligne de niveau.lvl
  10.     fgets(ligneFichier, NB_BLOC_LARGEUR * NB_BLOC_HAUTEUR + 1, fichier);
  11.     for(i=0; i<NB_BLOC_LARGEUR; i++)
  12.     {
  13.         for(j=0; j < NB_BLOC_HAUTEUR; j++)
  14.         {
  15.             switch (ligneFichier[(i * NB_BLOC_LARGEUR) + j])
  16.             {
  17.                 case '0':
  18.                     niveau[j][i] = 0;
  19.                     break;
  20.                 case '1':
  21.                     niveau[j][i] = 1;
  22.                     break;
  23.                 case '2':
  24.                     niveau[j][i] = 2;
  25.                     break;
  26.                 case '3':
  27.                     niveau[j][i] = 3;
  28.                     break;
  29.                 case '4':
  30.                     niveau[j][i] = 4;
  31.                     break;
  32.             }
  33.         }
  34.     }
  35.     fclose(fichier);
  36.     return 1;
  37. }

]
 
J'espere me faire comprendre.
En vous remerciant d'avance ;)

mood
Publicité
Posté le 28-12-2010 à 18:27:11  profilanswer
 

n°2044886
ptitchep
Posté le 28-12-2010 à 23:08:13  profilanswer
 

Salut
 
Tu peux utiliser fseek pour te déplacer dans le fichier.
 
int fseek(FILE *stream, long offset, int whence);


---------------
deluser --remove-home ptitchep
n°2044890
key94
Posté le 28-12-2010 à 23:43:22  profilanswer
 

ptitchep a écrit :

Salut
 
Tu peux utiliser fseek pour te déplacer dans le fichier.
 
int fseek(FILE *stream, long offset, int whence);


 
 
Ok je te remercie
 
Je ne connaissais pas fseek, je me suis renseigné dessus et j'ai compris un peu comment ca marche.
Cependant je ne vois toujours pas comment lui indiquer d'aller directement a la ligne 2 ou 3 ou 4.
Dois-je compter au bout de combien de caractère j'arive à la lligne 2?
 
Merci encore

n°2044908
xilebo
noone
Posté le 29-12-2010 à 09:11:19  profilanswer
 

fseek ne te permet pas de te déplacer par ligne, mais par offset uniquement.
 
Si la taille de ligne est fixe, tu peux cependant calculer l'offset correspondant.
 
Cela dit, dans ton exemple, tu pourrais plutôt charger l'ensemble des niveaux au démarrage ( dans un tableau de structures par exemple) et ensuite , rien ne t'empêche de commencer au niveau désiré, en indiquant l'index du tableau correspondant ( qui est en fait le niveau ).

Message cité 1 fois
Message édité par xilebo le 29-12-2010 à 09:13:06
n°2044915
olivthill
Posté le 29-12-2010 à 09:47:20  profilanswer
 

fseek() est surtout utilisé quand on ouvre le fichier en mode binaire. Or ici il est ouvert en mode texte, puisque il est ouvert avec "r" (d'ailleurs ce serait plus clair d'écrire "rt" ).
 
Pour lire la seconde ligne, le plus simple est de lire la première et de n'en rien faire, puis de lire la seconde ligne.
 
Ce n'est pas rare de refaire plusieurs fois la même chose, pas seulement parce que les machines vont tellement vites de nos jours que l'on n'a pas toujours besoin d'optimiser ses traitements, mais aussi parce qu'il y a des "caches" qui font qu'en réalité, il y a déjà quelques optimisations.

n°2044927
key94
Posté le 29-12-2010 à 10:49:24  profilanswer
 

olivthill a écrit :

Pour lire la seconde ligne, le plus simple est de lire la première et de n'en rien faire, puis de lire la seconde ligne.
 


 
Ok je comprends.
 
Ce que je n'arrive pas à faire c'est à selectionner la ligne de mon niveaux.lvl
 
Par exemple si je veux faire une boucle, je ne sais pas comment dire "tant qu'on est pas à la ligne 2" ou "tant qu'on est pas à la ligne 4".
Je sais pas si j'arrive à me faire comprendre.
 
Voici le contenu de mon fichier niveaux.lvl

Code :
  1. 111110111111111114111111111110111111111100011111111102011111111100111111111100111111111100111111111130111111111111111111111111111111111111111111
  2. 111110111111111114111111111110111111111000000111111010110111111000000111111010100111111020110111111000113111111111111111111111111111111111111111
  3. 111110111111000314111111001110111111101000000111100000110111101000020111101110100111100000110111111111111111111111111111111111111111111111111111
  4. 111110111111111114111111111110111111111000000111100010110111101110110111101110110111100002000111100110111111100110111111100110111111300000111111
  5. 111110111111111114111111111110111111110000011111110112011111110110011111130000003111111110111111111110111111111100111111111102111111111100111111
  6. 111110011111111114000001111100011001033101011011000002001211100101000011111100011211111111111001111130000001111111111111111111111111111111111111


 
merci

n°2044930
ptitchep
Posté le 29-12-2010 à 10:58:47  profilanswer
 

xilebo a écrit :

fseek ne te permet pas de te déplacer par ligne, mais par offset uniquement.

 

Si la taille de ligne est fixe, tu peux cependant calculer l'offset correspondant.

 

Cela dit, dans ton exemple, tu pourrais plutôt charger l'ensemble des niveaux au démarrage ( dans un tableau de structures par exemple) et ensuite , rien ne t'empêche de commencer au niveau désiré, en indiquant l'index du tableau correspondant ( qui est en fait le niveau ).


J'avais en effet cru comprendre que la taille des lignes était fixée.
Je pense aussi que charger tous les niveaux peut être pas mal, si leur taille est raisonnable.


Message édité par ptitchep le 29-12-2010 à 11:17:50

---------------
deluser --remove-home ptitchep
n°2044933
ptitchep
Posté le 29-12-2010 à 11:15:25  profilanswer
 

key94 a écrit :

 

Ok je comprends.

 

Ce que je n'arrive pas à faire c'est à selectionner la ligne de mon niveaux.lvl

 

Par exemple si je veux faire une boucle, je ne sais pas comment dire "tant qu'on est pas à la ligne 2" ou "tant qu'on est pas à la ligne 4".
Je sais pas si j'arrive à me faire comprendre.

 

Voici le contenu de mon fichier niveaux.lvl

Code :
  1. 111110111111111114111111111110111111111100011111111102011111111100111111111100111111111100111111111130111111111111111111111111111111111111111111
  2. 111110111111111114111111111110111111111000000111111010110111111000000111111010100111111020110111111000113111111111111111111111111111111111111111
  3. 111110111111000314111111001110111111101000000111100000110111101000020111101110100111100000110111111111111111111111111111111111111111111111111111
  4. 111110111111111114111111111110111111111000000111100010110111101110110111101110110111100002000111100110111111100110111111100110111111300000111111
  5. 111110111111111114111111111110111111110000011111110112011111110110011111130000003111111110111111111110111111111100111111111102111111111100111111
  6. 111110011111111114000001111100011001033101011011000002001211100101000011111100011211111111111001111130000001111111111111111111111111111111111111
 

merci


Pour savoir où tu en es, tu peux par exemple réorganiser ton fichier.
Exemple bidon:

 

niveau1
10120120120132131021000012
niveau2
1012502120313201320131201011113201

 

fgets s'arrête à la lecture du retour chariot donc il ne lira jamais quelque chose du genre "0113231013201\nniveau2" mais toujours "0113231013201\n" puis "niveau2\n". Tu peux donc lire tant que tu n'es pas à la fin du fichier ou que tu n'as pas lu quelque chose de forme "niveauX"

 

Si tu ne veux/peux pas réorganiser le fichier tu peux lire tant que le dernier caractère n'est pas '\n' puisque fgets le place dans le buffer. Cela t'indique la fin de ligne et te permet de les "compter".


Message édité par ptitchep le 29-12-2010 à 11:16:06

---------------
deluser --remove-home ptitchep
n°2044934
olivthill
Posté le 29-12-2010 à 11:18:06  profilanswer
 

key94 a écrit :

si je veux faire une boucle, je ne sais pas comment dire "tant qu'on est pas à la ligne 2" ou "tant qu'on est pas à la ligne 4".


Code :
  1. int read_to(int no_last_line, char *buf, int buf_max_len)
  2. {
  3.   FILE *fp;
  4.   buf[0] = '\0';
  5.   fp = fopen("/media/MacOs/prog/c/Marion Sokoban/niveaux.lvl", "rt" );
  6.   if (fp == NULL)
  7.      return(-1);
  8.   for (i = 0; i < no_last_line; i++)
  9.       fgets(buf, buf_max_len, 1, fp);
  10.   fclose(fp);
  11.   return(0);
  12. }

n°2044935
key94
Posté le 29-12-2010 à 11:39:19  profilanswer
 

Merci beaucoup pour ces réponses ca ma inspiré.
 
J'essaie ca et je vous tiens au courant

mood
Publicité
Posté le 29-12-2010 à 11:39:19  profilanswer
 

n°2044937
ptitchep
Posté le 29-12-2010 à 11:43:46  profilanswer
 

A mon avis, si la ligne est plus longue que buf_max_len, cela ne fonctionne pas. Le fgets suivant continue la ligne inachevée non?


---------------
deluser --remove-home ptitchep
n°2044978
key94
Posté le 29-12-2010 à 14:57:42  profilanswer
 

désolé, j'étais parti manger
J'ai pas essayer ton code encore.
Je voulais tester un truc avant, vous allez me dire si c'est possible.
Je voulais essayer de stocker chaque ligne dans un tableau int.

Code :
  1. while (fgets(ligneFichier, NB_BLOC_LARGEUR * NB_BLOC_HAUTEUR + 1, fichier) != NULL)
  2.     {
  3.         for(i=0; i<6; i++)
  4.         {
  5.              fscanf(fichier, "%d", &lvl[i]);
  6.         }
  7.     }


 
J'ai pas encore tester, il faut que je reflechise à comment faire pour commencer par exemple à level[2].
Je ne maitrise pas du tout la lecture de fichier en c.
 
Merci


Message édité par key94 le 29-12-2010 à 15:03:13
n°2044986
xilebo
noone
Posté le 29-12-2010 à 15:45:42  profilanswer
 

fscanf sert à lire dans un fichier. Or, tu lis déjà dans le fichier avec fgets. Il te faut alors utiliser plutôt sscanf sur la variable ligneFichier, qui contient une ligne entière de ton fichier.
 
 
Si tu connais le nombre exact d'éléments, tu peux faire un seul appel à sscanf. Sinon, tu peux boucler jusqu'à ce que sscanf te renvoie 0. Attention, contrairement aux fonctions de manipulation de flux ( fscanf , fXXX ), sscanf n'avance pas dans la chaine que tu lui fournis, il faudra alors avancer toi même dans la chaine ( de la taille de la précédente lecture).


Message édité par xilebo le 29-12-2010 à 15:47:19
n°2045013
key94
Posté le 29-12-2010 à 18:40:21  profilanswer
 

c'est bon ca marche. Je me suis inspiré du code de olivthill et ca marche.
J'ai juste rajouté un for.

Code :
  1. for(i=0; i<=2; i++)
  2. {
  3.      fgets(ligneFichier, NB_BLOC_LARGEUR * NB_BLOC_HAUTEUR + 1, fichier);
  4. }


 
c'est tout rien de plus et ca m'a l'air de marché.
 
En tout cas MERCI A TOUS de m'avoir aidé


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  lire seconde ligne d'un fichier avec fgets en c

 

Sujets relatifs
Upload fichier et notification par mail !ouverture fichier texte
Lire un fichier.txt et le traduire en listeRenvoi du numéro de ligne d'une cellule en VBA
traitement un fichier de données en C++Gestion d'un fichier de réservation.
Erreur de segmentation fgets avec GCC[BAT]Copier un fichier d'un bureau vers les autres profils
Batch Supprimer le caractère = contenu dans un fichier 
Plus de sujets relatifs à : lire seconde ligne d'un fichier avec fgets en c


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR