Programmation C Lecture d'un fichier

Fermé
syrinero Messages postés 2 Date d'inscription jeudi 13 juin 2013 Statut Membre Dernière intervention 14 juin 2013 - 14 juin 2013 à 17:26
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 18 juin 2013 à 01:44
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 samedi 20 octobre 2012 Statut Membre Dernière intervention 26 juillet 2013 77
Modifié par roptat le 14/06/2013 à 17:49
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 jeudi 13 juin 2013 Statut Membre Dernière intervention 14 juin 2013
14 juin 2013 à 17:56
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 samedi 20 octobre 2012 Statut Membre Dernière intervention 26 juillet 2013 77
14 juin 2013 à 18:00
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 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
18 juin 2013 à 01:44
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