Supprime une ligne spécifique dans un fichier, numéro de ligne 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
   -------------------------------------------------------
   Supprime une ligne dans un fichier (en acces direct).
   -------------------------------------------------------
   arg   : Fichier a lire.
   arg   : Ligne du fichier a supprimer.
   return: true si la suppression est possible,
          false sinon.
   ---------------------------------------------------- */
t_bool file_tools_delete_line (char const * const s_filename,
                               unsigned int i_line_num)
{
    FILE * p_file_src    = NULL;
    FILE * p_file_tmp    = NULL;
    char * s_line        = NULL;
    unsigned int cpt = 1;
    t_bool bool = true;


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

    if (!s_filename) {
        /* Erreur: l'argument numero 1 est incorrect. */
        return false;
    }

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

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

    if (!p_file_src) {
        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. */
        fclose (p_file_src);
        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)) {
        if (cpt != i_line_num) {
            fputs (s_line, p_file_tmp);
        }

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

    /* ----- 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