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 :

ftell et fseek


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut ftell et fseek
    Bonjour j'aimerais quelques explications sur comment utiliser ftell() et fseek() car j'ai un peu de mal a les comprendre.

    Le programme suivant lis d'un fichier qui contient des articles. Au debut de chaque article il y a un titre, et entre chaque article il y a une etoile. Le programme lis les titres et les imprime sur l'ecran.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    # include <stdio.h>
    # include <stdlib.h>
     
    # define   INFILE   "starabstracts.dat" 
    # define   ARRAYSIZE    100
     
    main ( )
    {
      FILE * fp;
      long offset [ ARRAYSIZE ];
      int c = 0;
      char iline [ 81 ];
     
      for ( c = 0; c < ARRAYSIZE; c ++ )
        offset [ c ] = -1;
     
      system ( "clear" );
      if ( ( fp = fopen ( INFILE, "r"  ) ) == NULL ) {
        printf ( "Unable to open %s!\n\n", INFILE );
        perror ( INFILE );   
        exit ( 1 );
        }
     
      c = 0;    
      fgets ( iline, 81, fp );
      while ( ! feof ( fp )  ){
        if ( iline [ 0 ] == '*' ) {  
          offset [ c ] = ftell ( fp ); 
          c ++;
          }  
        fgets ( iline, 81, fp );
        }    
     
      for ( c = 0; offset [ c ] >= 0; c ++ ) {
     
        fseek ( fp, offset [ c ], SEEK_SET );
        fgets ( iline, 81, fp );
        printf ( "%3d. %s", c + 1, iline );  
        }
    }
    Le resultat contient rien qu'une liste des titres d'articles.

    Le probleme c'est que meme si j'ai le code je ne comprend pas comment cela a ete fait.

    Est ce que quelqu'un pourrait m'expliquer un peu le role de l'array "offset" et des for loop qu'on voit dans le code.

    Aussi, comment les 2 fonctions fseek et ftell pourraient me servir pour ecrire un programme qui lis d'un fichier et exclu des lignes qui contiennent des strings qu'on connait a l'avance. Qui seront generalement des "tags" entre <>

  2. #2
    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 virtuadrack Voir le message
    Bonjour j'aimerais quelques explications sur comment utiliser ftell() et fseek() car j'ai un peu de mal a les comprendre.
    As-tu lu la doc ?

    http://man.developpez.com
    Le programme suivant lis d'un fichier qui contient des articles. Au debut de chaque article il y a un titre, et entre chaque article il y a une etoile. Le programme lis les titres et les imprime sur l'ecran.

    <...>
    Le resultat contient rien qu'une liste des titres d'articles.

    Le probleme c'est que meme si j'ai le code je ne comprend pas comment cela a ete fait.

    Est ce que quelqu'un pourrait m'expliquer un peu le role de l'array "offset" et des for loop qu'on voit dans le code.
    Ce code commenté (j'ai supposé que tu connaissais les fonctions de bases des fichiers, fopen(), fgets()...) :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    # include <stdio.h>
    # include <stdlib.h>
     
    # define   INFILE   "starabstracts.dat" 
    # define   ARRAYSIZE    100
     
    main ( )
    {
      FILE * fp;
      /* tableau d'indexation qui va relever la position de chaque '*' */
      long offset [ ARRAYSIZE ];
      int c = 0;
      char iline [ 81 ];
     
    /* par defaut, le tableau est rempli de -1. */
      for ( c = 0; c < ARRAYSIZE; c ++ )
        offset [ c ] = -1;
     
      system ( "clear" );
      if ( ( fp = fopen ( INFILE, "r"  ) ) == NULL ) {
        printf ( "Unable to open %s!\n\n", INFILE );
        perror ( INFILE );   
        exit ( 1 );
        }
     
    /* Ce codage est infâme, mais il parcours le fichier en relevant la position de chaque '*' avec ftell(). La valeur (l'index de la donnée dans le fichier) est stockée dans le tableau au fur et à mesure en séquence. C'est ce qu'on appelle une 'indexation'. */
      c = 0;    
      fgets ( iline, 81, fp );
      while ( ! feof ( fp )  ){
        if ( iline [ 0 ] == '*' ) {  
          offset [ c ] = ftell ( fp ); 
          c ++;
          }  
        fgets ( iline, 81, fp );
        }    
     
    /* relecture du fichier par accès direct, avec fseek(), à la position de l'info */
      for ( c = 0; offset [ c ] >= 0; c ++ ) {
     
        fseek ( fp, offset [ c ], SEEK_SET );
        fgets ( iline, 81, fp );
     
        /* affichage en 'sautant' l'*' */
        printf ( "%3d. %s", c + 1, iline );  
        }
    }
    Aussi, comment les 2 fonctions fseek et ftell pourraient me servir pour ecrire un programme qui lis d'un fichier et exclu des lignes qui contiennent des strings qu'on connait a l'avance. Qui seront generalement des "tags" entre <>
    Je ne suis pas bien sûr que tu ais besoin de ftell()/fseek() pour faire ça...

    A moins que ce soit imposé dans le cadre d'un exercice, la question de l'outil vient avec le besoin, et pas le contraire...

    Fait l'analyse de ton problème, écrit un algorithme et tu ferras si tu as besoin de telle ou telle fonction... Le choix d'un outil ne doit jamais intervenir avant l'analyse.

  3. #3
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    Merci pour ta reponse...

    J'aime bien compliquer les choses

    J'ai trouve la solution a mon probleme, fallait juste ajouter une condition

    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
     
    # include <stdio.h>
    # include <stdlib.h>
     
    # define   FILENAME   "abstracts.dat"
     
    int main ( void )
    {
     
      FILE * fp;
      char buffer [ 81 ];
     
      if ( ( fp = fopen ( FILENAME, "r" ) ) == NULL ) {
        fprintf ( stderr, "fileloop1: Unable to open %s!\n", FILENAME );
        exit ( 1 );
        }
     
      while ( fgets ( buffer, 81, fp ) ) {
      if ( buffer [ 0 ] != '<' ) {
         fputs ( buffer, stdout );
       }
      }
     
      fclose ( fp );
      return 0;
    }
    PS: pourquoi tu dis que le code d'avant est "infame" ?

  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 virtuadrack Voir le message
    PS: pourquoi tu dis que le code d'avant est "infame" ?
    Parce qu'il ne teste pas correctement la fin de lecture (boucle infinie en cas d'erreur, car feof() ne traite que la fin de fichier). Maintenant, c'est OK.

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

Discussions similaires

  1. fseek et ftell
    Par Emarcotte dans le forum R
    Réponses: 2
    Dernier message: 24/05/2013, 19h50
  2. Utilisation de fseek et ftell
    Par berlilou dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/03/2008, 10h35
  3. Access violation avec fseek
    Par baleine dans le forum C
    Réponses: 7
    Dernier message: 18/03/2005, 16h41
  4. Compréhension de fseek
    Par Argonz dans le forum C
    Réponses: 9
    Dernier message: 12/01/2004, 15h01
  5. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17

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