Retourne le numéro de la ligne du fichier validant le pattern 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_find_line_pattern ----------------------------------------------------- Retourne le numero de la ligne du fichier validant le pattern. ----------------------------------------------------- arg : Fichier a lire. arg : Chaine de caracteres a retrouver. return: Numero de la ligne, -1 en cas d'erreur. ----------------------------------------------------- */ int file_tools_find_line_pattern ( char const * const s_filename, char const * const s_string) { FILE * p_file = NULL; char * s_line = NULL; int ret = -1; int cpt = 1; char done = 0; /* ----- Verification des arguments ----- */ if (!s_filename || !s_string) { /* Erreur: arguments invalides. */ return -1; } /* ----- Ouverture du fichier ----- */ 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; } /* ----- Recherche du numero de la ligne ----- */ while (fgets (s_line, BUFSIZ, p_file)) { /* 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) { /* La ligne a ete trouvee, on sort. */ done = 1; break; } memset (s_line, 0, sizeof (s_line)); cpt++; } /* On transmet le numero de la ligne a la variable de retour si la ligne a ete trouvee. */ if (done) { ret = cpt; } /* Fermeture du fichier. */ fclose (p_file); /* Liberation du buffer. */ free (s_line); s_line = 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