Bonsoir à tous, je fais un projet et je viens de rencontrer un petit disfonctionnement je cherche des explications...
J'ai un fichier qui contient la définiton d'une matrice (en première ligne du fichier on a le nombre de ligne et le nombre de colonne (de la matrice), puis la suite c'est la matrice elle même)
EX:
3 3
1 2 3
4 5 6
7 8 9
Mon but est d'écrire une fonction qui lit le contenu du fichier et renvoie tous ce contenu (y compris la première ligne) sous forme de char* et voici mon code (qui fonctionne..fin je pense):
gestion_fichiers.c
le .h:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
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
34
35
36
37
38 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "gestion_fichiers.h" char *lire_fichier(char *nom_fichier){ FILE *fichier = fopen(nom_fichier, "r"); int nbreL = fgetc(fichier); nbreL = (int)nbreL - '0';//cast fgetc(fichier); //Espace entre le nombre de lignes et le nombre de colonnes au début du fichier int nbreC = fgetc(fichier); nbreC = (int)nbreC - '0';//cast int taille_ligne = nbreC + (nbreC -1);//La taille de la ligne à lire se calcule en incluant les espaces, pour n colonnes il y a n-1 espaces char *current_line_data = (char*)malloc(nbreC * sizeof(char)); char *file_data = (char*)malloc(nbreC * nbreL * sizeof(char)+3); //will store the retrieved data # +3 is the nbreL space and nbreC printf("L = %d et C = %d", nbreL, nbreC); fseek(fichier, 0, SEEK_SET);//Get the cursor back to first ligne strcat(file_data, fgets(current_line_data, 4, fichier));//La première ligne du fichier if(fichier != NULL){ while(fgets(current_line_data, taille_ligne +1, fichier)){ strcat(file_data, current_line_data);//We are sure the space is enough for all datas because we calculated it earlier } }else{ printf("The file %s doest not exist! exiting...", nom_fichier); exit(1);//Error can be handleled } free(current_line_data); return file_data; } void desallouer_donnees_fichier(char *ptr_datas){ free(ptr_datas); }
gestion_fichiers.h
Dans le main j'appelle ma fonction avec le code suivant:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 #include <stdio.h> #include <stdlib.h> char *lire_fichier(char *nom_fichier); void desallouer_donnees_fichier(char *ptr_datas);
main.c:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h> #include <stdlib.h> #include "gestion_fichiers.h" int main(){ printf("\n-----------GESTION DU FICHIER!-------\n"); char *donnees = lire_fichier("file.txt"); printf("Affichage des données:\n %s", donnees); printf("\n-----------AUREVOIR !-------\n"); //desallouer_matrice(mat); //desallouer_matrice(produit); desallouer_donnees_fichier(donnees); return 0; }
Ce code marche bien mais lorsque je déboguait ailleurs j'ai constaté que la ligne 16 du fichier "gestion_fichiers.c" n'alloue pas un tableau de char de taille nbreC * sizeof(char)
En réalité j'a remplacé cette ligne par:
qui normalement devrait allouer 1 octet, ce qui devait me faire apparaitre une belle érreur de ségmentation (mon ami de tous les jours :p) à la ligne 24 mais au contraire tous ce passe bien : je me demande donc est ce que le fait que j'ai utilisé un malloc ou fgets le pousse recalculer la nouvelle taille à chaque tour de la boucle qui est à la lgine 24???
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 char *current_line_data = (char*)malloc(1);
Best regards.
Partager