Programmation C Lecture d'un fichier

syrinero Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, Je vous serai très reconnaissante si vous m'aidiez à résoudre,
en fait je suis débutante en Programmation C et j'ai besoin de lire un fichier du format suivant:
NbDeDepots = 2
NbDeClients= 3
depl = [23,3,42,43,23,25,3,4,33,29,29,38,3,39,37,40,10];

WindowsC=[<192,192>,<356,356>,<418,418>];

DureeDeVisite=[139,37,32,102,72,75,49,32,107,37,25,88,47,118,131,63,52,139,69,98];

WindowsD=[<0,695>,<0,695>];

j'ai commencé à coder,
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <libgen.h>

FILE *ficl;
char *mot;
char a;
char *CHAINE;

//fonction qui lit un caractère:
char read_c(void)
{
a=fgetc (ficl);
return a;
}

//fonction qui lit un mot:
void read_mot(char* mots)
{
mots = (char*)malloc(30*sizeof(char));
fscanf (ficl, "%s\n", CHAINE);
strcpy(mots, CHAINE);
//return mots;
}

void charge_param()
{
int NbDeDepots;
int NbDeClients;
read_mot(mot);
if (!strcmp(mot,"NbDeDepots"))
{
read_c();
read_c();
read_c();
read_mot(mot);
NbDeDepots=atoi(mot);
}
else
{
read_mot(mot);
if (!strcmp(mot,"NbDeClients"))
{
read_c();
read_c();
read_c();
read_mot(mot);
NbDeClients=atoi(mot);
}
}
}

int main()
{
ficl = fopen("essai.txt", "r"); // ouvrir en lecture
if(!ficl){
printf("Impossible d'ouvrir le fichier \n");
exit(1);
}
else
{
read_mot(mot);
charge_param();
}
}

il me donne erreur de segmentation..
Je vous remercie d'avance.
A voir également:

2 réponses

roptat Messages postés 276 Date d'inscription   Statut Membre Dernière intervention   77
 
Ouhlala quelle horreur !
Ne déclare jamais de variable globale, c'est toujours horrible...
Tu te sers mal des pointeurs. Voici ce qui se passe :

Au début, mot pointe vers un endroit aléatoire de la mémoire, probablement NULL parce qu'il n'est pas initialisé. Puis lors de l'appel à read_mot, il est passé en paramètre et mots, une
copie
de mot contient NULL.
Après le malloc, mots contient (par exemple) 0xFFA5B289 et mot contient NULL car mots est une copie, sans lien avec mot, sinon qu'elle a la même valeur au début lors de l'appel à la fonction.
Au retour de la fonction, tu compares mot, à NULL avec "NbDeDepots", ce que ton OS n'aime pas (déréférencement du pointeur NULL -> segfault).

Un pointeur est en fait une variable comme les autres qui contient un nombre, représentant une adresse en mémoire. Lorsque tu passe une variable en paramètre, la variable d'origine n'est pas modifiée.
1
syrinero Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
merci, en fait il me manquait ça :
CHAINE = (char*)malloc(30*sizeof(char));
et
mot = (char*)malloc(30*sizeof(char));
0
roptat Messages postés 276 Date d'inscription   Statut Membre Dernière intervention   77
 
oui mais là, ils vont simplement contenir des données aléatoires (l'état de la mémoire au moment de l'allocation). Lors de l'appel à read_mot, mot n'est pas modifié (ou alors j'ai pas compris en quoi consiste ta modification).
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut syrinero / syrine;

Dans ton message ci-dessus, on lit :

NbDeDepots = 2
NbDeClients= 3 

alors que dans ton message ici : https://forums.commentcamarche.net/forum/affich-28012006-besoin-d-aide-programmation-c on lit :

NbDeDepots = 2;
NbDeClients= 3; 

Y a-t-il des ; ou pas, les as-tu oubliés ?


Dal
0