Bonjour,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
#include <stdio.h>
# define MAX_LEN_LINE 1024 // Tu peux augmenter si tu veux
int main()
{
char str[MAX_LEN_LINE];
char **tab;
FILE *file;
int nbLine;
nbLine = 0;
if ((file = fopen("./dossier/fichier.txt", "r")) == NULL) // Ouvre le fichier ciblé à "./dossier/fichier.txt' en mode lecture (r comme read)
return (-1); // Le fichier ne peut pas être lu ou n'existe pas
while ((fgets(str, MAX_LEN_LINE, file))) // Compte le nombre de lignes à enregistrer dans le tableau
{
if (*str != '*') // Si la ligne ne commence pas par le symbole '*'
nbLine++;
}
file = freopen("./dossier/fichier.txt", "r"); // Ferme et re-ouvre le fichier afin de placer le 'curseur' de lecture du fichier au début, ainsi fgets recommence à partir du début
if ((tab = malloc(nbLine)) == NULL)
return (1); // Si la mémoire demandée n'a pas pu être allouée
nbLine = 0;
while ((fgets(str, MAX_LEN_LINE, file))) // On recommence la boucle pour relire les lignes du fichier
{
if ((tab[nbLine] = strdup(str)) == NULL) // Copie la ligne dans tab
return (-1); // Si la mémoire demandée n'a pas pu être allouée
nbLine++;
}
fclose(file);
return (0);
} |
Je n'ai pas vérifier ce code, car je l'ai tapé directement dans le post mais je pense que ça devrait être bon. Si un point te semble obscure, n'hésite pas.
A propos de fgets :
Vérifie que tu as bien mis '#include <stdio.h>' et que tu as bien ouvert avec fopen(). Le prototype de fgets est => char *fgets (char *s, int size, FILE *stream);
*s est une chaîne de caractère déjà allouée.
size est le nombre de caractère lu au maximum. Cela évite des segmentations faults en écrivant dans s (si s[10] et que ta ligne fait 20 caractères, tu segfaulteras).
FILE *stream est une variable particulière à utiliser avec les autres fonctions de même type comme fopen, fclose, fread, fwrite, fgets, fgetc etc.
Partager