Calcule le nombre d'occurrences d'un mot passé en paramètre dans un fichier, recherche sensible à la casse

#include "t_bool.h"
#include "file_tools.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


/* Nom du fichier temporaire. */
#define TEMP_FILE "example.txt"

/* Liste, non exhaustive, de delimiteurs */
#define DELIM " *§:/;!.,?&~<>{([|])}\"\\+="

/* ------------------------------------------------------
   file_tools_nbr_word
   ------------------------------------------------------
   Trouve le nombre d'occurences d'un mot dans un fichier
   (acces direct).
   Recherche sensible a la casse.
   ------------------------------------------------------
   arg   : Fichier a lire.
   arg   : Mot a retrouver.
   return: Nombre d'occurences du mot, -1 en cas d'erreur.
   ---------------------------------------------------- */
int file_tools_nbr_word (char const * const s_filename,
                         char const * const s_word)
{
    FILE * p_file        = NULL;
    char * s_line        = NULL;
    char * p_temp        = NULL;
    char * p_temp_word   = NULL;
    int ret = -1;
    int cpt = 0;


    /* ----- Verification des arguments. */

    if (!s_filename || !s_word) {
        /* Erreur: arguments invalides. */
        return -1;
    }

    /* ----- Ouverture du fichier a lire ----- */

    p_file = fopen (s_filename, "r");

    if (!p_file) {
        /* Erreur: impossible d'ouvrir le fichier. */
        return -1;
    }

    /* ----- Allocation du buffer temporaire ----- */

    s_line = malloc (BUFSIZ);

    if (!s_line) {
        /* Erreur: impossible d'allouer l'espace
         requis. */
        fclose (p_file);
        return -1;
    }

    /* ----- Parcours du fichier ----- */

    while (fgets (s_line, BUFSIZ, p_file)) {
        /* Recherche du nombre d'occurence du mot 
          dans la ligne recuperee. */
        p_temp = s_line;
        while ((p_temp_word = strtok (p_temp, DELIM))
              != NULL) {
            /* Comparaison du mot de la chaine */
            if (strcmp (p_temp_word, s_word) == 0) {
                cpt++;
            }

            p_temp = NULL;
        }


        /* On efface le buffer. */
        memset (s_line, 0, sizeof (s_line));
    }


    /* On transmet la valeur du compteur a la 
      variable de retour. */
    ret = cpt;

    /* Fermeture du fichier. */
    fclose (p_file);

    /* Liberation du buffer temporaire. */
    free (s_line);
    s_line = NULL;

    p_temp_word = NULL;

    return ret;
}



  Vous pouvez retrouver cette fonction ainsi que toutes les autres fonctions de la catégorie Fichier dans l'archive file_tools.zip.

L'archive comprends les fichiers suivants :

  • example1.txt et example2.txt deux fichiers utilisés par la méthode main.
  • t_bool.h : déclaration du type booléen.
  • file_tools.h et file_tools.c : déclaration et implémentation des fonctions de la catégorie Fichier.
  • main.c : fonction permettant et mettant en œuvre l'ensemble des fonctions Fichier.

  Exécution

$gcc main.c file_tools.c -o filetools
$chmod +x filetools
$./filetools