lire seconde ligne d'un fichier avec fgets en c - C - Programmation
Marsh Posté le 28-12-2010 à 23:08:13
Salut
Tu peux utiliser fseek pour te déplacer dans le fichier.
int fseek(FILE *stream, long offset, int whence);
Marsh Posté le 28-12-2010 à 23:43:22
ptitchep a écrit : Salut |
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
Marsh Posté le 29-12-2010 à 09:11:19
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 ).
Marsh Posté le 29-12-2010 à 09:47:20
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.
Marsh Posté le 29-12-2010 à 10:49:24
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 :
|
merci
Marsh Posté le 29-12-2010 à 10:58:47
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.
Marsh Posté le 29-12-2010 à 11:15:25
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". Voici le contenu de mon fichier niveaux.lvl
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".
Marsh Posté le 29-12-2010 à 11:18:06
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 :
|
Marsh Posté le 29-12-2010 à 11:39:19
Merci beaucoup pour ces réponses ca ma inspiré.
J'essaie ca et je vous tiens au courant
Marsh Posté le 29-12-2010 à 11:43:46
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?
Marsh Posté le 29-12-2010 à 14:57:42
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 :
|
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
Marsh Posté le 29-12-2010 à 15:45:42
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).
Marsh Posté le 29-12-2010 à 18:40:21
c'est bon ca marche. Je me suis inspiré du code de olivthill et ca marche.
J'ai juste rajouté un for.
Code :
|
c'est tout rien de plus et ca m'a l'air de marché.
En tout cas MERCI A TOUS de m'avoir aidé
Marsh Posté le 28-12-2010 à 18:27:11
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
]
J'espere me faire comprendre.
En vous remerciant d'avance