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