se placer dans un fichier.txt en C [ Probléme Résolut ]

se placer dans un fichier.txt en C [ Probléme Résolut ] - C - Programmation

Marsh Posté le 11-08-2008 à 07:22:55    

Bonjour tout le monde,
 
je cherche à me positionner dans un fichier.txt en connaissant le numéro de la ligne à la quelle je souhaite me placer au début.
 
je ne connais que deux fonctions de positionnement dans un txt
 
fseek :
prototype

Code :
  1. int fseek(FILE* pointeurFichier, long deplacement, int origineDuDeplacement);


 
int origineDuDeplacement modifiée par:

Code :
  1. SEEK_SET //début du fichier.
  2. SEEK_CUR //position actuelle du curseur.
  3. SEEK_END //fin du fichier


 
je ne pense pas que je puisse l'utiliser car je ne suis pas sensé connaitre le nombre de déplacement, je sais juste que je doit me mettre au début de telle ligne connue
 
rewind : positionne le curseur au début
 
édit: je suis sur windows xp pro
 
je suis pas encore très doué en C alors j'ai pas de gros reflex et si c'est possible de me placer à une ligne connue dans un txt avec ces fonctions merci de me mettre sur la voie pour que je trouve, mais sinon merci de me donner la fonction qui pourrais m'aider, merci d'avance
 
ou encore je viens d'avoir l'idée à l'instant, comment compté le nombre de "\n" dans un txt merci je pense que sa pourrais m'aider, merci d'avance, édit: enfin sa je sais le faire, mais surtout se placer après un "\n" précisément.


Message édité par torx le 11-08-2008 à 18:25:18
Reply

Marsh Posté le 11-08-2008 à 07:22:55   

Reply

Marsh Posté le 11-08-2008 à 08:59:27    

En général, on procède pas comme ça. Soit tu lis tout ton txt dans un char* et tu travail en mémoire ou bien tu itères sur ton fichier avec fgets. On se déplace rarement en x,y dans un fichier

Reply

Marsh Posté le 11-08-2008 à 09:20:31    

A peu près compris pour la première méthode je vais essayer et je te dit après.
 
sinon itérer mon fichier avec la fonctions fgets, je connais la fonctions mais j'ai pas trop compris
 
merci


Message édité par torx le 11-08-2008 à 09:21:34
Reply

Marsh Posté le 11-08-2008 à 09:22:39    

une ligne c'est une vue de l'esprit: un fichier C, c'est un flux de d'octets, pas une collection d'enregistrement. fgets c'est bien, mais attention à l'usage (code de retour, est-ce que la chaine lue contient bien un \n sinon buffer trop petit, etc)

Reply

Marsh Posté le 11-08-2008 à 09:24:32    

Il y a aussi fgetpos et fsetpos.
 
fseek pour les fichiers textes (et c'est particulièrement vrai sous Windows) ne peut utiliser de manière sûre que le résultat de ftell; fsetpos ne peut utiliser que les résultats de fgetpos.
 
Donc la méthode est de lire une première fois le fichier en gardant un tableau des débuts de lignes puis de s'en servir.

Reply

Marsh Posté le 11-08-2008 à 18:22:29    

C'est bon problème résolut, bon vu l'heure vous vous direz il est bien lent ^^
 
mais j'ai soulagée la nuit blanche pour le reste du programme
 
enfin voila j'ai donc calculé le nombre de ligne de mon fichier.txt avec
 
 

Code :
  1. while(fgets(chaine, TAILLE_MAX, fichierDicoMotSecret) != NULL)
  2. {
  3.     nombreDemots++;
  4. }
  5. MAX = nombreDemots;
  6. srand(time(NULL));
  7. numeroDeLaLigneDuMot = (rand() % (MAX - MIN + 1)) + MIN;
  8. rewind(fichierDicoMotSecret);
  9. do
  10. {
  11.     fgets(chaine2, TAILLE_MAX, fichierDicoMotSecret);
  12.     arretALaLigne++;
  13. }while(arretALaLigne < numeroDeLaLigneDuMot);


 
chaine2 contiendra donc le mot à la ligne numeroDeLaLigneDuMot
 
enfaite c'était pour un jeu de Pendu et j'ai un fichier dictionnaire de mot secret pour ne pas toujours tombé sur le même
 
voila au moins sa m'auras fait apprendre quelque chose  :bounce:  :bounce:  :bounce:


Message édité par torx le 11-08-2008 à 18:22:44
Reply

Marsh Posté le 11-08-2008 à 18:23:38    

ouais alors ça ce moment lis ton fichier en entier dans un tableau de chaine de caractère et tire au hasard l'indice dans ton tableau.
La ton truc est affreusement lent ^^

Reply

Marsh Posté le 11-08-2008 à 18:32:56    

mon truc est affreusement lent ?
Hum certes mais j'ai pas encore les acquis pour le dire/savoir alors je fait avec ce que je connais ^^
 
j'ai acquis tout ce que je connais sur internet alors je rate sans doute des choses intéressantes mais bon j'espére les connaitre plus tard
 
et si tu pourrais me proposé une version plus rapide hésite pas que je regarde comment sa marche
 
édit:
et avec mon code je dois remplacer '\n' par '\0' sinon j'ai un caractère en trop,
voila :) c'est tout fini, c'est lent mais sa marche  :bounce:


Message édité par torx le 11-08-2008 à 18:49:55
Reply

Marsh Posté le 11-08-2008 à 19:02:39    

bah c'est pareil sauf que au lieu de compter le nombre de ligne, tu recopie la ligne lu dans une nouvelle chaine de caractère allouée à la bonne taille et que tu range dans une structure genre lise chainée.

Reply

Marsh Posté le 11-08-2008 à 19:23:23    

ok ok compris vi sa sera mieux

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed