cs_AlexN
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
19
15 sept. 2006 à 02:05
Je te propose une version qui me semble plus courte, pas forcément plus efficace mais moins il a de lignes, plus les erreurs sont groupées :
// Compte le nombre d'occurences d'un mot dans un fichier
// Un mot est une suite de caractères alphabétiques (a-zA-Z) encadrée par deux caractères parmi
// le debut de fichier, la fin de fichier ou un caractère non-alphabétique
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void usage (char **argv) {
printf ("Usage : %s MotAChercher FichierSource FichierRésultat\n", **argv);
exit (EXIT_SUCCESS);
}
void erreur (char *err, char *f) {
char msg[100];
sprintf (msg, "%s %s", err, f);
perror(msg);
exit (EXIT_FAILURE);
}
int main(int argc, char *argv[]) {
FILE *f;
char *mot; int i 0, occ 0, c;
char rep[100];
if ( argc != 4 ) usage(argv);
if ( !(mot = (char *) malloc (strlen(argv[1]) + 1)) ) { perror("malloc"); exit (EXIT_FAILURE); }
if ( !strcpy (mot, argv[1]) ) { perror("strcpy"); exit (EXIT_FAILURE); }
// Ouvrir le fichier source
if ( !(f = fopen (argv[2], "r")) ) erreur("Problème pour ouvrir en lecture le fichier", argv[2]);
// Compter
while ( ( c = fgetc (f) ) != EOF ) { // c'est long
if ( !mot[i] && !isalpha(c) ) { occ++; i = 0; } // Trouvé ! else if ( c !mot[i] ) i 0;
else i++;
}
if ( fclose(f) == EOF ) erreur("Problème pour fermer le fichier", argv[2]);
// Ouvrir le fichier cible
if ( !(f = fopen (argv[3], "w")) ) erreur("Problème pour ouvrir en écriture le fichier", argv[3]);
sprintf (rep, "Mot '%s' trouvé %d fois dans le fichier %s.\n", mot, occ, argv[2]);
free(mot);
if ( fputs(rep, f) == EOF ) { perror("fputs"); exit (EXIT_FAILURE); };
if ( fclose(f) == EOF ) erreur("Problème pour fermer le fichier", argv[3]);
// Resultats
puts(rep);
// sprintf (rep, "cat %s", argv[3]);
// system (rep);
return EXIT_SUCCESS;
}
Si tu veux les accents et d'autres exotismes, tu modifies la condition dans le while pour inclure les caractères que tu veux inclure dans tes mots.
Le debut et la fin c'est du décor, le milieu c'est la partie qui compte.