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

  FORUM HardWare.fr
  Programmation
  C

  [C] Manipulation de chaines dans un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Manipulation de chaines dans un fichier

n°1760312
LaTex_man
Posté le 16-07-2008 à 14:50:19  profilanswer
 

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 ?

mood
Publicité
Posté le 16-07-2008 à 14:50:19  profilanswer
 

n°1760372
olivthill
Posté le 16-07-2008 à 15:53:28  profilanswer
 

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 .

n°1760394
dap++
Script kiddie
Posté le 16-07-2008 à 16:08:45  profilanswer
 

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
n°1760402
LaTex_man
Posté le 16-07-2008 à 16:19:43  profilanswer
 

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
n°1761383
LaTex_man
Posté le 18-07-2008 à 12:03:09  profilanswer
 

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à ...

n°1761411
Taz
bisounours-codeur
Posté le 18-07-2008 à 12:44:08  profilanswer
 

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.


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

  [C] Manipulation de chaines dans un fichier

 

Sujets relatifs
Indicer les lignes d'un fichier texte avec C++Lecture fichier en binaire et valeur en hexa
modification fichier *.set[Resolu] asp.net/C#/SQl server2005 affichage resultats recherche
Extraire lignes d'un fichier .csv avec Visual C++export table SQL vers fichier
[C] Operand incorect .Dessiner une belle ligne au stylet
Plus de sujets relatifs à : [C] Manipulation de chaines dans un fichier


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