IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

lecture dans un fichier


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut lecture dans un fichier
    Hello tout le monde,

    Voici mon premier post, généralement je trouve la solution à mes question dans ces forums, mais là ce n'est pas le cas.

    Dans un code C, je cherche à lire une ligne spécifique de fichier possiblement très gros. Je connais le numéro de ligne à lire.

    Comme je dois faire cette procédure très souvent, je ne souhaite bien sur pas relire les 10000 premieres lignes si je veux lire la ligne 10001.

    Je cherche donc à faire un fseek me positionnant directement sur la bonne ligne...

    Avez vous des idées ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    avec fseek tu ne pourras pas obtenir directemet la ligne que tu veux comme ca si elles n'ont pas toute la meme taille.

    En revanche, si tu lis de facon sequentielle ton fichier, rien ne t empeche de creer une structure telle que:

    typedef struct {

    FILE * file;

    int line_count;
    }

    ...

    qui mette en relation un numero de ligne courant avec la position du descripteur de fichier.


    ou alors tu peux faire des listes chainee (ou autre container) si tu dois faire des aller-retour dans le fichier

    typedef struct N {

    int seek_value;

    int line_number;

    struct N * next;
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    ok...
    J'trouve qu'il est curieux que ce probleme si simple n'ait pas de solution immédiate.

    Je pense que je vais indexer une fois toutes les lignes de mon fichier (une ligne = un offset) dans un bete tableau, puis réutiliser ce tableau à chaque appel de ma procédure.

    Merci en tout cas.

    Pierre

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par smashy
    En revanche, si tu lis de facon sequentielle ton fichier, rien ne t empeche de creer une structure telle que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct {
     
      FILE * file;
     
      int line_count;
    }
    ...

    qui mette en relation un numero de ligne courant avec la position du descripteur de fichier.
    Ca s'appelle une indexation, mais ça ne concerne absolument pas un FILE *, mais la valeur retournée par ftell() (un long)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Merci à tout le monde pour vos prospections !
    J'ai retenu la solution de l'indexation car mon fichier est fixe.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    Voilà une solution, ça marche pour des fichiers n'évoluant pas durant le traitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    long * offset_indexor (FILE * file, const char * file_name){
      // line numbers
      unsigned long long nb_lines;
     
      char cmd [1024];
      sprintf(cmd,"wc -l %s",file_name);
      FILE * tmp_FILE = popen (cmd, "r");
      fscanf(tmp_FILE,"%llu", &nb_lines);
      fclose(tmp_FILE);
     
      fprintf(stderr,"%llu positions indexed in %s\n", nb_lines, file_name);	
      long * offset_index = (long *)malloc(sizeof(int)*nb_lines);
      if(!offset_index){
        fprintf(stderr,"Cannot allocate %llu longs; exit\n", nb_lines); exit(-1);
      }
      char c;
      char s [512];
      //rewind to top
      fseek(file,0,SEEK_SET);
      for(unsigned long i=0;i<nb_lines;i++){
        offset_index[i]=ftell(file);
        fscanf(file,"%[^\n]%c",s,&c);
      }
     
      return offset_index;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. macros word et lecture dans un fichier excel
    Par antrax2013 dans le forum Windows
    Réponses: 2
    Dernier message: 01/10/2005, 19h05
  2. Réponses: 20
    Dernier message: 25/09/2005, 15h07
  3. Lecture dans un fichier
    Par unknown4 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 14/08/2005, 17h56
  4. [Débutant] Lecture dans un fichier texte
    Par babemagus dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/07/2005, 12h17
  5. Réponses: 12
    Dernier message: 14/06/2004, 13h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo