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
file_tools.zip