Exercice langage C: Position d'une chaîne de caractère dans un Fichier

Écrire une fonction qui retourne les différentes positions d'une chaîne de caractères dans un fichier texte ou binaire.

Le nom du fichier, ainsi que la chaîne seront transmis en argument au programme.

On pourra le tester avec les arguments suivants :

  1. exo18 exo18_data_bin save
  2. exo18 exo18_data_bin SAVE
  3. exo18 exo18_data_txt où-suis-je?

#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);
}

Article publié le 20 Février 2012 Mise à jour le Lundi, 07 Novembre 2022 21:18 par BENKIRANE Fatima Ezzahra