Besoin d'aide

romainbisson Messages postés 88 Date d'inscription jeudi 25 octobre 2007 Statut Membre Dernière intervention 9 septembre 2014 - 29 mai 2008 à 17:31
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 - 29 mai 2008 à 21:45
Bonjour,

j'ai besoin de faire un programme qui lit ligne par ligne un fichier en recuperant a certains emplacement de la ligne, la valeur :

exemple de ligne :

13;Condi.;I2041 ;70398   ;JARRET AVT A/OS PO CG              ;035215;20090927;000015;00295.420;00000.000;830026598000352157;20080331;P;20080328;N;13;20080422

les trucs en rouge sont a recuperer dans un autre fichier

merci de votre aide

j'ai deja commencé a tapé un petit programme mais il n'est pas bon car il lit les lignes du début jusqu'a la fin

PS :
la premiere valeur est entre 17 et 26
la deuxieme valeur est entre 62 et 69
la troisieme valeur est entre 124 et 133

merci de votre aide ..

#include <stdio.h>
#include <string>


int main(int argc, char **argv)


{
   
    char *nf;
    char buffer[100000];
    long adresse[100000];
    int compteur;
    nf = argv[1];
   
    FILE *f;
   
    while(true){
                f = fopen(nf,"r");
                if(f) break;
                printf("\n *** ERREUR A L'OUVERTURE DU FICHIER ***\n");
                }
               
    compteur = 0;
    adresse[compteur++] = 0;
    while(fgets(buffer,sizeof(buffer),f));
    adresse[compteur++] = ftell(f);
    --compteur;
   
    for(int i = compteur-1 ; i>=0 ; --i){
            fseek(f,adresse[i],SEEK_SET);
            fgets(buffer,sizeof(buffer),f);
           
            if(buffer != NULL){
                     
                      printf("%s",buffer-5);
                     
                      }
                      }
                     
                      fclose(f);
                      return 0;
                      }
                     

2 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
29 mai 2008 à 17:48
fseek et donc ton tableau adresse sont inutiles ici. fgets déplace elle-même, en lisant la ligne, le "curseur" de lecture.
À moins que tu souhaites garder la position des lignes. Dans ce cas, tu peux remplir ton tableau adresse dans la même boucle où tu affiche la extrait ligne.

printf("%s",buffer-5);
???

Tu commences à lire 5 octets avant le buffer ???

while(true){
                f = fopen(nf,"r");
                if(f) break;
                printf("\n *** ERREUR A L'OUVERTURE DU FICHIER ***\n");
                }

Ton programme bouclera indéfiniment ici si ton fichier n'existe pas.

Finalement, une lecture ligne par ligne n'est concevable qu'avec des projets modestes ou des exercices. Impensable d'utiliser cette méthode dans un projet de plus grande envergure.
Une lecture par bloc de plusieurs ko et un traitement fait à même ce buffer sera infiniment plus rapide. À prévoir pour tes futures projets.

C++ (@++)<!--
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
29 mai 2008 à 21:45
Tu telecharge cette source:
http://www.cppfrance.com/codes/WIN32-LIRE-FICHIER-LIGNE-LIGNE_44453.aspx

et apres tu pourra lire facilement ton fichier ligne par ligne.

ex:
#define MAX_LINE_SIZE 1024

char szLine[MAX_LINE_SIZE];
char szFile[] = "C:\\ton_fichier.txt";
int i;

LPOPENL lpoLine;
lpoLine = OpenLine(szFile, GetTypeOfFile(szFile));
for(i=1; i!=10; i++)
{
ReadLine(lpoLine, i, szLine);
printf("%s\n", szLine);
}
CloseLine(lpoLine);

Neo_Fr
0
Rejoignez-nous