[ C ] Aide pour programme de lecture fichier txt

Aide pour programme de lecture fichier txt [ C ] - C - Programmation

Marsh Posté le 13-04-2007 à 17:56:53    

Bonjour,
 
Je vous explique, j'ai un fichier texte qui contient des données en colonnes : 1 colonne de float et 6 autres de int.
 
Les données arrivent au fur et à mesure dans ce fichier texte.
 
Je souhaite donc pouvoir lire ces données ligne par ligne et si la ligne n'est pas encore là, attendre quelle apparaisse.
 
Autre info : le fichier contiendra plusieurs milliers de ligne, donc il faudrait un code qui ne prenne pas trop de temps.
 
 
J'arrive à lire la 1ere ligne du fichier comme il faut avec la commande fscanf cependant je n'arrive pas à pouvoir choisir la ligne à traiter.
 
 
D'avance merci si vous arrivez à éclairer ma lanterne.  :D

Reply

Marsh Posté le 13-04-2007 à 17:56:53   

Reply

Marsh Posté le 13-04-2007 à 19:25:50    

malibu68 a écrit :

Bonjour,
 
Je vous explique, j'ai un fichier texte qui contient des données en colonnes : 1 colonne de float et 6 autres de int.
 
Les données arrivent au fur et à mesure dans ce fichier texte.
 
Je souhaite donc pouvoir lire ces données ligne par ligne et si la ligne n'est pas encore là, attendre quelle apparaisse.
 
Autre info : le fichier contiendra plusieurs milliers de ligne, donc il faudrait un code qui ne prenne pas trop de temps.
 
 
J'arrive à lire la 1ere ligne du fichier comme il faut avec la commande fscanf cependant je n'arrive pas à pouvoir choisir la ligne à traiter.
 
 
D'avance merci si vous arrivez à éclairer ma lanterne.  :D


 
Grosso-modo, en C, pour mnipuler un fichier, tu as
- des fonctions d'ouverture/fermeture => fopen()/fclose()
- des fonctions de lecture => fscanf(), fgets(), fgetc(), fread()
- des fonctions d'écriture => fprintf(), fputs(), fputc(), fwrite()
- des fonctions de déplacement => fseek()
- des fonctions un peu spéciales => fflush(), ftell(), feof()
Rien d'autre. C'est à toi à utiliser ces fonctions pour créer l'algo dont t'as besoin. Par exemple, si tu veux récupérer la 18° ligne, il te faut
- lire 17 lignes pour rien
- lire la ligne suivante
 
Ensuite, étant donné que ces fonctions sont bufférisées, je ne connait pas le comportement de ce genre de fonctions quand tu lis d'un coté un fichier qui se remplit de l'autre coté.  
 
Si tu bosses sur Unix et apparentés, t'as aussi des fonctions plus bas niveau qui sont
- des fonctions d'ouverture/fermeture => open()/close()
- une fonction de lecture => read()
- une fonction d'écriture => write()
- des fonctions de déplacement => seek()
Ces fonctions plus bas niveau travaillent directement sur le fichier donc la manipulation de "je lis pendant que qqun d'autre écrit" a plus de chances de réussir...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-04-2007 à 20:22:21    

Merci j'ai résolu mon problème.
 
Par contre dans mon cas je n'aurais pas à lire 17 lignes pour rien (heureusement ca prendrait trop de temps vu la taille du fichier final).
 
Il suffit de faire appel plusieurs fois de suite à la fonction fscanf, les lignes seront lues successivement. J'ai un problème de lecteur à cause d'une colonne supplémentaire dans mon fichier. Pour ne pas en tenir compte il faut faire un %*d.

Reply

Marsh Posté le 14-04-2007 à 19:01:26    

malibu68 a écrit :

Par contre dans mon cas je n'aurais pas à lire 17 lignes pour rien (heureusement ca prendrait trop de temps vu la taille du fichier final).
 
Il suffit de faire appel plusieurs fois de suite à la fonction fscanf, les lignes seront lues successivement.


Ben oui. Tu fais plusieurs fois appel à fscanf() et tes lignes sont lues successivement pour rien (c'est à dire qu'elles sont lues mais tu n'utilises pas ce qu'elles te renvoient).
D'ailleurs, je te conseillerais plutôt "fgets()" qui est plus rapide que "fscanf()"...
 

malibu68 a écrit :

J'ai un problème de lecteur à cause d'une colonne supplémentaire dans mon fichier. Pour ne pas en tenir compte il faut faire un %*d.


Au pire, tu utilises "fgets()" => Ca te donne une ligne entière de ton fichier (jusqu'au <return> ) qu'ensuite tu peux analyser avec différentes fonctions de traitement de chaînes (strstr(), strtok_r(), strchr() ou simplement sscanf())


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 15-04-2007 à 15:05:46    

Et pourquoi ne pas utiliser fseek pour se déplacer dans le fichier? C'est quand même plus rapide!

Reply

Marsh Posté le 15-04-2007 à 16:53:44    

Oué c'est kler, et utilise les pointeurs, c'est bien plus rapide.

Reply

Marsh Posté le 16-04-2007 à 09:09:25    

jramakichenin a écrit :

Et pourquoi ne pas utiliser fseek pour se déplacer dans le fichier? C'est quand même plus rapide!


C'est plus rapide à condition de connaître le nb d'octets de déplacement. Donc c'est si tu as un fichier avec des lignes de taille fixe.
 
Lui, il doit lire un fichier "texte", donc à priori avec des lignes qui ne sont pas de la même taille.
En dehors de "x" fgets(), je ne vois pas ce qui pourrait être plus rapide pour sauter "x" lignes...
 

bneben a écrit :

Oué c'est kler, et utilise les pointeurs, c'est bien plus rapide.


Plus rapide que quoi ? Que fopen/fclose ?????


Message édité par Sve@r le 16-04-2007 à 09:13:26

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

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