[C] Manipulation de chaines dans un fichier

Manipulation de chaines dans un fichier [C] - C - Programmation

Marsh Posté le 16-07-2008 à 14:50:19    

Salut tout le monde,
 
Voici mon problème qui est plus proche d'un problème de conception et de réflexion que d'un problème de C.  
Je dois récupérer des données dans un fichier résultat.
 
Données :

  •  Ce fichier dans lequel sont stockés des résultats n'est pas rangé comme il devrait l'être (c'est à dire : 1ère colonne position, 2ème colonne vitesse ...).  
  • Il est constitué de phrases génériques comme celle ci "Toto habite dans une maison située à 15 m de chez lui". "Toto2 habite dans une maison située à 20 m de chez lui".
  • Je veux récupérer le 15 et le 20


Solution ?

  • Il faut parcourir le fichier ligne par ligne.  

=> Solution : tester au moyen de getc(pfichier) la fin du fichier. Tant que c'est différent de EOF, je continue.

  • Recherche de la ligne voulue.

=> Solution :  
- Je teste au moyen de fgets la présence d'une chaine d'une certaine longueur  
- Et il faut qu'elle soit égale en même temps à "Toto habite dans ..." au moyen de strcmp(chaine , "toto" )

  • Si on est sur la bonne ligne, je me replace au début (fseek) et j'affecte le 15 km au moyen de ????  


Ce qui donnerai à la fin

Code :
  1. /* NOTE : pfichier pointeur fichier avec fopen  
  2.     MAX_CHAINE : longueur de ce que je recherche ou celle de la ligne ? */
  3. // Tant que je n'atteins pas la fin de fichier, je continue ...  
  4. while ( getc(pfichier) != EOF)
  5. // Test de la chaine  
  6. if ( (fgets(chaine , MAX_CHAINE , pfichier) != NULL ) && (strcmp(chaine , "Toto habite ..." ) ) {
  7. // On se replace au debut de la chaine trouvée  
  8.   fseek(pfichier, - sizeof(char)*MAX_CHAINE , SEEK_CUR);
  9. // Comment je prends le 15 km ???
  10. }


 
Est ce que je suis sur le bon chemin ou je me trompe complètement ?

Reply

Marsh Posté le 16-07-2008 à 14:50:19   

Reply

Marsh Posté le 16-07-2008 à 15:53:28    

Petites remarques préalables :
Il manque fopen (en mode texte) et fclose.
Et comme toutes les fonctions commencent par la lettre "f" j'utiliserais fgetc au lieu de getc pour des raisons d'esthétisme.
 
La solution habituelle n'est pas le panachage de fgets et fgetc, mais de n'utiliser que l'un ou l'autre, par exemple une boucle avec un fgets et une boucle pour traiter la ligne ramenée par fgets. Ou même plus simplement, si le fichier n'est pas gigantesque, on le lit d'un seul coup en mémoire par un fread et on traite le buffer en mémoire à la recherche des tokens ad hoc .

Reply

Marsh Posté le 16-07-2008 à 16:08:45    

J'ai pas compris quelle est la condition pour que le nombre de la ligne soit pris. Dans ton exemple tu prends celui de "Toto2 habite..." mais dans ton code tu ne le prends que si ça commence par "Toto habite...".
 
Sinon :
sizeof(char) est toujours égal à 1.
À mon avis fseek() ne fonctionnera pas, mets juste la ligne courante dans un buffer et travaille dessus.
Fais attention au fait que fgets() laisse le  '\n' dans la chaîne lue si il y a assez de place.
Pour lire le nombre utilise strtol().


---------------
dap.developpez.com
Reply

Marsh Posté le 16-07-2008 à 16:19:43    

olivthill,
J'ai tronqué mon code et effectivement, j'avais mis fopen et fclose (c'est pas nécessaire mais c'est bien apparemment :D)
 
J'ai avancé depuis tout à l'heure et je crois que j'ai trouvé mon bonheur dans la fonction sscanf.
 

Code :
  1. sscanf(ligne, "%s habite dans une maison située à %d m de chez lui", &nomDuGars, &distance)


 
 
Par contre, je retombe dans le problème soulevé par dap++, il faut que je récupère ma ligne, ce qui a été préalablement fait avec fgets ...
 
Je vais tester ça...


Message édité par LaTex_man le 16-07-2008 à 16:24:33
Reply

Marsh Posté le 18-07-2008 à 12:03:09    

Je suis désespéré là : je n'arrive pas à me déplacer correctement dans un fichier.  
A part le fseek, il n'y a pas d'autres solutions ?
Ce que je n'arrive pas à faire, c'est le passage de ligne en ligne.
Il n'y a pas plus simple avec un compteur de ligne par exemple et lui dire, allez, va sur cette ligne là bas ?
Je crois que je rêve trop là ...

Reply

Marsh Posté le 18-07-2008 à 12:44:08    

C'est normal, ça n'est pas fait pour ça, ça ne fonctionne pas comme ça. Un fichier c'est un flux de caractères, les lignes, ça n'existe pas.
 
Travaille sur une copie du fichier: tu recopies en changeant ce qui t'intéresses.

Reply

Sujets relatifs:

Leave a Replay

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