structurer un fichier [c] - C - Programmation
Marsh Posté le 11-05-2004 à 16:39:56
soit tu fais un fichier texte : tu utilises fscanf/fprintf
soit tu fais un fichier binaire (fread/fwrite)
mais dans ce cas t'es dans la merde, parce que tu as tout mélangé : un ingrédient n'est pas le maillon d'une liste.
donc si tu veux faire ça, il faut séparer les deux
struct ingredient { ... }
struct maillon_ingredient { struct ingrédient i; struct maillon_ingredient *suivant;}
après, tu parcoures ta liste, et tu écris (ou lis) p->i
Marsh Posté le 11-05-2004 à 18:13:24
je te remercie de m avoir répondu taz, c est très sympathique de ta part.
je crois pas qu il faut que je fasse un fichier binaire car j ai jamais vu cela en cours et puis ca a l air dur...
et fscanf c est pas possible car le nombre d ingredient varie en fonction de la recette.
en fait chaque recette se définie par
- son nom
- un pointeur sur les ingrédients/quantité qui repointe ensuite sur l ingrédient suivant
- un pointeur sur les instructions de préparation de le temps nécéssaire
-un pointeur sur la recette suivante
dans les instructions du projet , ils nous disent que les fonctions strtok ainsi que atoi(converti un string en int) seront très utiles .et soit disant c est possible de mettre le fichier dans la structure justement grace a strtok et strchr.
PLEASE HELP
Marsh Posté le 11-05-2004 à 18:49:00
le binaire est plus facile
- son nom
- un pointeur sur les ingrédients/quantité qui repointe ensuite sur l ingrédient suivant
- un pointeur sur les instructions de préparation de le temps nécéssaire
-un pointeur sur la recette suivante
ça c'est ton organisation en mémoire ... à toi de te débrouiller pour trouver une organisation dans ton fichier
atoi est mauvaise : utilise strtol
strtok aussi, attention à l'utilisation
strchr ne t'es d'aucun recours
spa compliqué dans ton fichier tu ranges
NOM_DE_LA_RECETTE
INGREDIENT;INGREDIENT; ...
INSTRUCTION; INSTRUCTION; ...
t'as plus qu'a lire 3 lignes par 3, et extraire les informations
Marsh Posté le 11-05-2004 à 19:21:40
Ou alors:
NOM_DE_LA_RECETTE
nb d'ingredients
INGREDIENT
...
INGREDIENT
nb d'instructions
INSTRUCTION
...
INSTRUCTION
ou alors:
NOM_DE_LA_RECETTE
INGREDIENT
...
INGREDIENT
MARQUE_DE_FIN_D'INGREDIENTS
INSTRUCTION
...
INSTRUCTION
MARQUE_DE_FIN_D'INSTRUCTIONS
ou alors (my favorite )
<recette name = "NOM_DE_LA_RECETTE">
<ingredient>...</ingredient>
...
<ingredient>...</ingredient>
<instruction>...</instruction>
...
<instruction>...</instruction>
</recette>
A+,
Marsh Posté le 11-05-2004 à 20:24:39
dans son cas, je ne pense pas qu'un fichier en pseudo xml l'aidera...
a mon sens, il n'y a d'interet a utiliser du xml qu'avec un bon parseur xml, je penserais par exemple a xerces.
A priori dans son cas, pas de libs donc un format personnalise restera sans doutes le plus simple.
Utiliser des '\n' et ';' comme delimiteurs me parait tres bien, ca donne une sortie plutot propre, facile a parser (quelque soit le delimiteur en fait) mais je suggererais diony11 de verifier les caracteres admis dans les noms d'ingredients/recettes/instruction pour ne pas avoir de mauvaises (tres mauvaises surprises par la suite!
enfin je dis ca, je dis rien
Marsh Posté le 11-05-2004 à 20:47:41
je ne comprends pas tout ce que vous m avez écrit... en fait vous me conseillez , si j ai bien compris , de modifier mon fichier . Mais je ne peux pas , le projet impose d utiliser le format : Nom de la recette:ingredient1,quantité;ingrédient2,quantité;...:temps de préparation:instruction pour la recette \n
je peux pas le modifier , il fo que je travaille avec , et donc forcément avec les délimiteurs \n , ; et :.
pour le xml , je connais pas du tout , et ca m étonnerait que j ai a l utiliser.
mais voila je patoge complètement!
Marsh Posté le 11-05-2004 à 20:58:04
diony11 a écrit : je ne comprends pas tout ce que vous m avez écrit... en fait vous me conseillez , si j ai bien compris , de modifier mon fichier . Mais je ne peux pas , le projet impose d utiliser le format : Nom de la recette:ingredient1,quantité;ingrédient2,quantité;...:temps de préparation:instruction pour la recette \n |
essai de lire ça :
http://www.programmationworld.com/site/Cours.asp?Action=cours&Numero=109#_topic_14
Marsh Posté le 11-05-2004 à 21:13:30
c gentil prettysmile , je sais comment marche strtok.
t inquietes pas j ai deja essayé google,mais j ai rien trouvé qui pourrait m aider pour a l utilisé pour les structures
Marsh Posté le 11-05-2004 à 21:18:25
diony11 a écrit : je ne comprends pas tout ce que vous m avez écrit... en fait vous me conseillez , si j ai bien compris , de modifier mon fichier . Mais je ne peux pas , le projet impose d utiliser le format : Nom de la recette:ingredient1,quantité;ingrédient2,quantité;...:temps de préparation:instruction pour la recette \n |
Effectivement tu patoges!
Meme si tu ne comprends pas, tu peux et tu dois rester logique par rapport a ce que tu sais!
Tu as un format impose? tres bien, pourquoi ne pas avoir commence par la en le disant CLAIREMENT...
Ensuite, si tu regardais de plus pres ton format et celui propose par Taz, tu verrais que c'est quasiment la meme chose, la logique pour generer l'un et l'autre sera identique, ce n'est qu'une question de formatage!
Vu ton niveau, si tu veux t'en sortir, t'as interret a essayer sur le papier deja de definir clairement ce que tu as et ce que tu veux. Ensuite reflechis a comment passer de l'un a l'autre!
Fais des petits schemas avec fleches et boites, du pseudo-code, ce que tu veux, mais si tu ne maitrise pas parfaitement ton langage, tu ne pourra jamais passer outre cette etape!
Deja qu'en maitrisant c pas toujours facile (et rarement reccomande, quoique pour cet exemple je m'en passerais volontier
Donc je t'aide un peu...
Tu as des structures qui chacune represente un de tes elements. Tu sais comment tes donnees sont representes dans le programme, les liens entre les differentes structures. Bien, ensuite tu sais a quoi doit ressembler une recette complete (soit une structure recette, plusieurs ingredients, plusieurs instructions) dans ton fichier texte. Essaye avec un exemple simple, genre une recette avec 1 ingredient et 1 instruction et compare le contenu des structures avec le fichier texte. Tu devrais voir comment ont 'voyages' les donnees. Ensuite, complique avec un autre exemple avec plusieurs ingredients et plusieurs instructions. Pareille, regarde comment les donnees on voyages...
Sans t'en rendre compte, tu as tout seul trouve le cheminement des donnees pour passer des structures au fichier lorsque tu as fait ca sur le papier!
Reste plus qu'a identifier etape par etape ce que tu as fait dans ta tete et a formaliser ca a l'aide de fonctions.
Et hop, tu viens tout seul de creer ton propre algorithme et je te rassure, si tu as bien reflechi, ca marchera!
Voila, bon, j'ai pris le temps de te repondre avec un long post car j'avais vraiment rien d'autre a faire mais que ca devienne pas une habitude
Marsh Posté le 11-05-2004 à 21:30:15
ok je te remercie mordicator.effectivement j avais oublié de précisé que le format était imposé.par contre je viens d avoir une idée : modifier le format sur un fichier temporaire.jvé testé.
Marsh Posté le 11-05-2004 à 23:09:09
mordicator a écrit : dans son cas, je ne pense pas qu'un fichier en pseudo xml l'aidera... |
Pour parser du XML bien formé, tu as pas besoin de xerces, expat suffit, et c'est ultra leger.
Sinon, diony11, ce que tu veux faire n'est pas tres dur, a condition de faire gaffe a ce que tu veux parser.
Ce que tu veux parser:
1- recuperer tout jusqu'a un : ==> ca te donne le nom de la recette
2- tu sautes le :
3- recuperer tout jusqu'a une , ==> ca te donne le nom du premier ingredient
4- tu sautes la ,
5- recuperer tout jusqu'a un ; ou un : ==> ca te donne la quantite du premier ingredient
6- si tu es en un ; tu le sautes et retourne en 3, sinon tu es en un : tu le sautes
7- recuperer tout jusqu'a un : ==> ca te donne le temps de preparation de la recette
9- tu sautes le :
10- recuperer tout jusqu'a un \n ==> ca te donne la premiere instruction pour la recette
etc
(pas claire ton histoire: comment on sait qu'on arrive a une nouvelle recette? ca serait pas plutot instruction;instruction;...instruction\n ton format? auquel ca, le \n serait le delimiteur entre chaque recette)
Si tu etudies bien la documentation de strtok, tu verras comment l'utiliser pour faire les parties "recuperer tout jusqu'a un ..."
A+,
Marsh Posté le 12-05-2004 à 01:01:50
oui gilou , c est tout a fait ce que je souhaite faire.g un bon pote qui ma expliqué un peu la marche a suivre , et il faut alterner les strtok et les strchr pour bien se positionner dans le fichier.oui c est bien le \n le delimiteur de chaque recette.
sinon pour l idée du fichier temporaire , g vite abandonné.
jvous remercie ,mon programme ne marche tjrs pas mais j y vois plus clair.
Marsh Posté le 11-05-2004 à 16:34:45
bonjour,
j ai de grosses difficultés pour mettre un fichier dans une structure en C.
je vous explique , je réalise un projet sur une base de données de recettes enregistrées dans un fichier.
ma structure se présente sous la forme :
typedef struct recette { char nom[100];
struct ingredient * ing;
struct prepa * pr;
struct recette * re;
}recette;
typedef struct recette * livre;
typedef struct ingredient {char nom1[100];
int quantite;
struct ingredient * suiv;
}ingredient;
typedef struct prepa{int tps;
char facon[1000];
}prepa;
et mon fichier sous la forme :
Nom de la recette:ingredient1,quantité;ingrédient2,quantité;...:temps de préparation:instruction pour la recette
je galère trop !j ai beau avoir fait plein de recherches sur différents sites , je n ai rien trouvé qui pourrai m etre utile.je sais par contre qu on ne peut pas le faire avec fscanf car le nombre d ingrédient n est pas fixe.on ma conseillé de le faire avec strchr et strtok.pouvez vous m aider svp.
Message édité par diony11 le 11-05-2004 à 16:35:24