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 -
[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.
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:
- Programmation C Lecture d'un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
2 réponses
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
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.
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
copiede 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.
Salut syrinero / syrine;
Dans ton message ci-dessus, on lit :
alors que dans ton message ici : https://forums.commentcamarche.net/forum/affich-28012006-besoin-d-aide-programmation-c on lit :
Y a-t-il des ; ou pas, les as-tu oubliés ?
Dal
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
CHAINE = (char*)malloc(30*sizeof(char));
et
mot = (char*)malloc(30*sizeof(char));