OVH Cloud OVH Cloud

lecture donnees fichier

12 réponses
Avatar
David Quintanel
J'ai l'intention de lire les données d'un fichier du type:
David 5
Vincent 3

et de les ranger dans une liste chainée.
Voici ce que g fait

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 30

struct adresse
{
char nom[MAX];
int numeros;
struct adresse *suivant;
};


void main(void)
{
struct adresse *Nouveau, *Debut;
struct adresse *Lecture;
Debut=NULL;
FILE *Fichier;
Fichier=fopen("myfile.txt", "rb");
while(fread(Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))
{
Nouveau = (struct adresse *) malloc(sizeof(struct adresse));
strcpy(Nouveau->nom,Lecture->nom);
Nouveau->numeros=Lecture->numeros;
Nouveau->suivant=Debut;
Debut=Nouveau;
}
fclose(Fichier);
}

ça compile très bien (je bosse avec visual C++ 5.0) mais à l'execution ça
foire . Quelle est mon erreur ?
PS: le prog est en C

10 réponses

1 2
Avatar
The Chameleon
struct adresse *Lecture;
cell_t *Lecture=NULL;




Avec
cell_t Lecture;
ou
struct adresse *Lecture;
voir un petit
memset(Lecture, 0, sizeof(Lecture));

while(fread(Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))
il faut parser la ligne que tu lis. Elle ne va pas aller s'écrire comme

il faut dans la structure.

ca serait pas mieux de faire :

while(fread(&Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))

sinon je ne comprends pas bien ou il va placer ses données, non ?
Qu'en pensez vous ?

The Chameleon.


Avatar
AG
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 30

struct adresse
{
char nom[MAX];
int numeros;
struct adresse *suivant;
};
On a l'habitude d'utiliser un typedef pour les structures, c'est plus

court à l'utilisation :

typedef struct adresse
{
char nom[MAX];
int numeros;
struct adresse *suivant;
} cell_t;




void main(void)
int main(void) /* sinon c'est pas du C */



{
struct adresse *Nouveau, *Debut;
du coup ça deviendrais :

cell_t * Nouveau, *Debut;


struct adresse *Lecture;
cell_t *Lecture=NULL;


Debut=NULL;
FILE *Fichier;
Les déclarations de variables en C doivent êtres faites au début de la

fonction. en initialisant Debut à NULL "Debut=NULL", tu termines
implicitement la zone de déclaration de variables. Il faut inverser les
deux lignes.


Fichier=fopen("myfile.txt", "rb");
tester le retour de fopen est toujours mieux.


while(fread(Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))
il faut parser la ligne que tu lis. Elle ne va pas aller s'écrire comme

il faut dans la structure.

{
Nouveau = (struct adresse *) malloc(sizeof(struct adresse));
le cast du malloc n'est pas obligatoire. On aime bien écrire :


Nouveau = malloc(sizeof(*Nouveau));

c'est plus facile à maintenir.


strcpy(Nouveau->nom,Lecture->nom);
es-tu sur que ta chaine se termine bien par un 0 ?


Nouveau->numeros=Lecture->numeros;
Nouveau->suivantÞbut;
Debut=Nouveau;
}
fclose(Fichier);


avec le nouveau prototype de main, il faut retourner 0.

}

ça compile très bien (je bosse avec visual C++ 5.0) mais à l'execution ça
t'as du compiler avec un compilateur C++ ou alors tu n'as pas fait

attention aux warnings.

foire . Quelle est mon erreur ?
Corrige tout ça et après on en reparle.


Avatar
AG
struct adresse *Lecture;



cell_t *Lecture;

Debut=NULL;
FILE *Fichier;


Les déclarations de variables en C doivent êtres faites au début de la

fonction. en initialisant Debut à NULL "Debut=NULL", tu termines
implicitement la zone de déclaration de variables. Il faut inverser les
deux lignes. ou alors initialiser Debut lors de sa déclaration :

cell_t * Debut = NULL;


Avatar
Pierre Maurette
"David Quintanel" a écrit dans le message de news:
bi5361$92s$
J'ai l'intention de lire les données d'un fichier du type:
David 5
Vincent 3

et de les ranger dans une liste chainée.
Voici ce que g fait

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 30

struct adresse
{
char nom[MAX];
int numeros;
struct adresse *suivant;
};


void main(void)
{
struct adresse *Nouveau, *Debut;
struct adresse *Lecture;
Debut=NULL;
FILE *Fichier;
Fichier=fopen("myfile.txt", "rb");
while(fread(Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))
{
Nouveau = (struct adresse *) malloc(sizeof(struct adresse));
strcpy(Nouveau->nom,Lecture->nom);
Nouveau->numeros=Lecture->numeros;
Nouveau->suivantÞbut;
Debut=Nouveau;
}
fclose(Fichier);
}

ça compile très bien (je bosse avec visual C++ 5.0) mais à l'execution ça
foire . Quelle est mon erreur ?
PS: le prog est en C


Bonjour,
Il vous faut au moins ajouter :
Lecture = (struct adresse *)malloc(sizeof(struct adresse));
(tel quel, votre pointeur pointe n'importe où).
avant la boucle.
Remarque : c'est bizarre que ça compile chez vous, FILE *Fichier; étant
placé après Debut=NULL;
Pierre

Avatar
AG
The Chameleon wrote:
struct adresse *Lecture;


cell_t *Lecture=NULL;




Avec
cell_t Lecture;
cell_t *Lecture et cell_t Lecture sont deux choses différentes. Il me

semble qu'il voulait un pointeur sur la structure.


while(fread(Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))


il faut parser la ligne que tu lis. Elle ne va pas aller s'écrire comme
il faut dans la structure.



ca serait pas mieux de faire :
while(fread(&Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))
Ces deux versions ne marcherons pas.


ce qui va être lu dans le fichier n'est pas au format de la structure,
et fread ne le fera pas. Dans le fichier, si la premiere ligne est :

Vincent 13

il faut lire 10 caractères, et pas sizeof(Lecture) caractères.

Il faut donc stocker le résulat de la structure dans un buffer avec
fread() (on pourra utiliser fgets() qui, je pense, est plus approprié).

Ensuite il faut parser ce buffer, soit avec scanf() (mais dans ce cas
autant utiliser fscanf() directement, sans compter que scanf() est
difficile à maitriser), soit en bouclant sur les éléments du buffer, ce
qui est plus recommandé.

sinon je ne comprends pas bien ou il va placer ses données, non ?
Qu'en pensez vous ?
Vous avez mal lu : Lecture n'est pas une structure, mais un pointeur sur

une structure.

Alexandre, qui n'aime pas faire du parsing.



Avatar
Guillaume Leconte
On Fri, 22 Aug 2003 16:34:03 +0200, AG wrote:

Bonjour,

Debut=NULL;
FILE *Fichier;


Les déclarations de variables en C doivent êtres faites au début de la

fonction. en initialisant Debut à NULL "Debut=NULL", tu termines


Pas en C99 (Ok, c'est mieux de le faire, mais c'etait pour la precision).
Et c'est en debut de bloc, pas de fonction.

implicitement la zone de déclaration de variables. Il faut inverser les
deux lignes. ou alors initialiser Debut lors de sa déclaration :

cell_t * Debut = NULL;


Guillaume Leconte

--
"La foule est une somme d'erreurs qu'il faut corriger." WFN



Avatar
David Quintanel
"AG" a écrit dans le message de news:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 30

struct adresse
{
char nom[MAX];
int numeros;
struct adresse *suivant;
};
On a l'habitude d'utiliser un typedef pour les structures, c'est plus

court à l'utilisation :

typedef struct adresse
{
char nom[MAX];
int numeros;
struct adresse *suivant;
} cell_t;




void main(void)
int main(void) /* sinon c'est pas du C */



{
struct adresse *Nouveau, *Debut;
du coup ça deviendrais :

cell_t * Nouveau, *Debut;


struct adresse *Lecture;
cell_t *Lecture=NULL;


Debut=NULL;
FILE *Fichier;
Les déclarations de variables en C doivent êtres faites au début de la

fonction. en initialisant Debut à NULL "Debut=NULL", tu termines
implicitement la zone de déclaration de variables. Il faut inverser les
deux lignes.


Fichier=fopen("myfile.txt", "rb");
tester le retour de fopen est toujours mieux.


while(fread(Lecture ,sizeof(Lecture),1,Fichier)&&!feof(Fichier))
il faut parser la ligne que tu lis. Elle ne va pas aller s'écrire comme

il faut dans la structure.


Je suis assez débutant en C et je ne sais pas ce que veut dire "parser la
ligne" ?


{
Nouveau = (struct adresse *) malloc(sizeof(struct adresse));
le cast du malloc n'est pas obligatoire. On aime bien écrire :


Nouveau = malloc(sizeof(*Nouveau));

c'est plus facile à maintenir.


strcpy(Nouveau->nom,Lecture->nom);
es-tu sur que ta chaine se termine bien par un 0 ?


Nouveau->numeros=Lecture->numeros;
Nouveau->suivantÞbut;
Debut=Nouveau;
}
fclose(Fichier);


avec le nouveau prototype de main, il faut retourner 0.

}

ça compile très bien (je bosse avec visual C++ 5.0) mais à l'execution
ça


t'as du compiler avec un compilateur C++ ou alors tu n'as pas fait
attention aux warnings.

foire . Quelle est mon erreur ?
Corrige tout ça et après on en reparle.





Avatar
Cyrille \cns\ Szymanski
ça compile très bien (je bosse avec visual C++ 5.0) mais à l'execution ça
foire . Quelle est mon erreur ?
PS: le prog est en C


Donner une extension .c au fichier.


--
_|_|_| CnS
_|_| for(n=0;b;n++)
_| b&=b-1; /*pp.47 K&R*/

Avatar
Pierre Maurette
"Cyrille "cns" Szymanski" a écrit dans le message de
news:
...[BlaBla]
Donner une extension .c au fichier.
Que le fichier ait une extension .C, .CPP, voire .FRUNABULAX, soit je me

gourre (cas fréquent !), soit fread() reçoit un pointeur déclaré non
initialisé (Lecture). Normalement, ça fait boum.
Pierre

Avatar
AG
Je suis assez débutant en C et je ne sais pas ce que veut dire "parser la
ligne" ?


Ce n'est pas un terme spécifique au langage C.
Parser une ligne c'est comme l'analyser. Tu passe en revue tout ses
caractères un a un et tu en tire les informations que tu veux.
Tu trouveras pleins de détails sur le net à ce propos.

1 2