Problème allocation dynamique de char* en c
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
Code:
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);
} |
le .h:
gestion_fichiers.h
Code:
1 2 3 4 5
|
#include <stdio.h>
#include <stdlib.h>
char *lire_fichier(char *nom_fichier);
void desallouer_donnees_fichier(char *ptr_datas); |
Dans le main j'appelle ma fonction avec le code suivant:
main.c:
Code:
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:
Code:
1 2
|
char *current_line_data = (char*)malloc(1); |
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???
Best regards.