Exercice langage C corrigé position d’une chaîne de caractère dans un fichier

#include 
#include 
#include 
#include 
#include 
#include 

int    *positions;
int     nb_positions;
size_t  taille_bloc;

§MEVBCBfstatic void init( size_t longueur )
{
  positions = NULL;
  nb_positions = 0;
  taille_bloc = BUFSIZ - longueur + 1;

  return;
}

§MEVBCBfint main( int argc, char **argv )
{
   void  usage(char *s);
   void  strrech( char *buffer, int nblus,
                  char *ChaineAchercher, size_t longueur );
   int     fd;
   char    buffer[BUFSIZ];
   char   *ChaineAchercher;
   size_t  longueur;
   int     nblus;

   /*
    * Le fichier et la chaîne à chercher
    * ont-ils été passés en argument ?
    */

   if ( argc != 3 )
     usage( argv[0] );
   ChaineAchercher = argv[2];
   longueur = strlen( ChaineAchercher );

   /*
    * initialisation des variables globales.
    */
   init( longueur );

   /* Ouverture du fichier passé en argument. */

   if( (fd = open( argv[1], O_RDONLY )) == -1 )
   {
      perror( "open" );
      exit( 1 );
   }

    /* Boucle de lecture du fichier. */

   while( nblus = read( fd, buffer, sizeof buffer ) )
   {
     /*
      * Récupération des positions de la chaîne
      * dans le buffer courant.
      */

     strrech( buffer, nblus, ChaineAchercher, longueur );

     /*
      * Si BUFSIZ caractères ont été lus, on
      * recule de (longueur-1) caractères
      * dans le fichier, pour être sûr de n'oublier
      * aucune position de la chaîne.
      */

     if( nblus == BUFSIZ )
       lseek( fd, -(long)(longueur - 1), SEEK_CUR );
   }
   close( fd );

   /* Impression des positions trouvées. */

   if ( nb_positions == 0 )
     printf( "La chaîne \"%s\" n'a pas été trouvée\n"
             "dans le fichier \"%s\".\n",
              ChaineAchercher, argv[1] );

    else
   {
     int pos;

     printf( "Dans le fichier \"%s\", la chaîne \"%s\"\n"
             "a été trouvée aux positions :\n\n",
              argv[1], ChaineAchercher );
     for( pos=0; pos
/*
 * Fonction de récupération des positions
 * de la chaîne dans le buffer courant.
 */

§MEVBCBfvoid strrech( char *s, int nblus,
              §MEVBCBfchar *ChaineAchercher, size_t longueur )
{
   char       *buffer, *ptr;
   static int  n = 0, nombre_octets_lus = 0;
   int         i;

   /*
    * On prend garde de remplacer les éventuels caractères
    * "nuls" par des blancs pour pouvoir utiliser
    * la fonction "strstr".
    */

   buffer = malloc( nblus+1 );
   memcpy( buffer, s, nblus );
   for( i=0; i
   /* Boucle de recherche de la chaîne. */

   for( ptr=buffer;
        ptr=strstr( ptr, ChaineAchercher );
        ptr+=longueur )
   {
     /*
      * extension du vecteur positions.
      */

     positions = (int *)realloc( positions, ++n*sizeof(int) );
     assert( positions != NULL );

     /*
      * position de la chaîne trouvée par
      * rapport au début du bloc lu.
      */

     positions[n-1] = ptr - buffer + 1;

     /*
      * position de la chaîne trouvée par
      * rapport au début du fichier.
      */

     positions[n-1] += nombre_octets_lus;
   }
   free( buffer );

    /*
    * Nombre d'octets déjà lus dans le fichier.
    */

   nombre_octets_lus += taille_bloc;
   nb_positions = n;

   return;
}

§MEVBCBfvoid usage(char *s)
{
   fprintf( stderr, "usage: %s fichier"
                    " ChaineAchercher.\n", s );
   exit(1);
}

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *