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