Supprime une ligne spécifique selon un pattern dans un fichier, le pattern est passé en paramètre

#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_delete_line_pattern
   -----------------------------------------------------
   Supprime une ligne dans un fichier (en acces direct).
   La ligne a supprimer doit valider le pattern passe
  en deuxieme argument.
   -----------------------------------------------------
   arg   : Fichier a lire.
   arg   : Ligne du fichier a supprimer.
   return: true si la ligne a ete supprimee sinon false.
   ----------------------------------------------------- */
t_bool file_tools_delete_line_pattern (
                             char const * const s_filename,
                               char const * const s_string)
{
    FILE * p_file_src    = NULL;
    FILE * p_file_tmp    = NULL;
    char * s_line        = NULL;
    t_bool bool = true;


    /* ----- Test de la validite des arguments --- */

    if (!s_filename || !s_string) {
        /* Erreur: Un ou les deux arguments sont 
          invalides. */
        return false;
    }

    /* ----- Ouverture des fichiers ----- */

    /* Ouverture du fichier d'origine. */
    p_file_src = fopen (s_filename, "r");

    if (!p_file_src) {
        /* Erreur: impossible d'ouvrir le fichier. */
        return false;
    }


    /* Creation et ouverture d'un fichier
         temporaire. */
    p_file_tmp = fopen (TEMP_FILE, "w");

    if (!p_file_tmp) {
        /* Erreur: impossible de creer ou d'ouvrir
          le fichier. */
        return false;
    }

    /* ----- Allocation d'un tableau pour 
                       contenir la ligne ----- */

    s_line = malloc (BUFSIZ);

    if (!s_line) {
        /* Erreur: impossible d'allouer l'espace requis. */
        fclose (p_file_src);
        fclose (p_file_tmp);
        return false;
    }

    /* ----- Lecture du fichier ligne par ligne ----- */

    while (fgets (s_line, BUFSIZ, p_file_src)) {
        /* Suppression du caractere de saut de 
             ligne si necessaire. */
        char * p = strchr (s_line, '\n');

        if (p) {
            *p = 0;
        }


        /* Comparaison, si la ligne est differente, 
            on la copie dans le nouveau fichier. */
        if (strcmp (s_line, s_string) != 0) {
            /* On remet le caractere de saut de ligne
               s'il etait present. */
            if (p) {
                *p = '\n';
            }

            /* Ecriture de la ligne dans le fichier. */
            fputs (s_line, p_file_tmp);
        }

        memset (s_line, 0, sizeof (s_line));
    }

    /* ----- Fermeture des fichiers ----- */

    /* Fermeture des fichiers. */
    fclose (p_file_src);
    fclose (p_file_tmp);

    /* Inversion des nom de fichiers. */
    remove (s_filename);
    rename (TEMP_FILE, s_filename);

    /* Liberation de la memoire. */
    free (s_line);
    s_line = NULL;

    return bool;
}


  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