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 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);
}
le .h:
gestion_fichiers.h
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);
Dans le main j'appelle ma fonction avec le code suivant:
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:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
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.