OVH Cloud OVH Cloud

fread, fwrite...

10 réponses
Avatar
Nicolas aunai
salut

encore un peu de mal avec les fonction fread/fwrite...

mon livre dit : "size_t fread(void *ptr,size_t size,size_t nobj,FILE
*stream);

fread lit sur le flot stream au plus nobj objets de taille size et les
places dans le tableau ptr. fread retourne le nombre d'objets lus...etc.."

j'ai de mon coté, une structure :

typedef struct PostMessageBox{

char message[256];
char titre[256];
UINT uType;

}PostMessageBox;

enregistrée dans un fichier par la fonction fwrite appelée ainsi :

PostMessageBox *BoxFile;
FILE *file_p;
file_p=fopen("box1.box","wb");
if(file_p)
{
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);
}
fclose(file_p);

et je la lis ainsi :

FILE *file_p;
size_t return_fread;
PostMessageBox BoxFile;

file_p=fopen(filepath,"rb");
if(file_p)
{
return_fread=fread(&BoxFile,sizeof(BoxFile),1,file_p);
}

fclose(file_p);


le problème est qu'apperement le membre 'message' n'est pas correctement
enregistré (ou lu...)

qqn saurait-il m'expliquer d'ou vient l'erreur ?


--
nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@nospam@hotmail.com

10 réponses

Avatar
Tobias Oed
Nicolas aunai wrote:

salut

encore un peu de mal avec les fonction fread/fwrite...

mon livre dit : "size_t fread(void *ptr,size_t size,size_t nobj,FILE
*stream);

fread lit sur le flot stream au plus nobj objets de taille size et les
places dans le tableau ptr. fread retourne le nombre d'objets lus...etc.."

j'ai de mon coté, une structure :

typedef struct PostMessageBox{

char message[256];
char titre[256];
UINT uType;

}PostMessageBox;

enregistrée dans un fichier par la fonction fwrite appelée ainsi :

PostMessageBox *BoxFile;
FILE *file_p;
file_p=fopen("box1.box","wb");
if(file_p)
{
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);
}
fclose(file_p);

et je la lis ainsi :

FILE *file_p;
size_t return_fread;
PostMessageBox BoxFile;

file_p=fopen(filepath,"rb");
if(file_p)
{
return_fread=fread(&BoxFile,sizeof(BoxFile),1,file_p);
}

fclose(file_p);


le problème est qu'apperement le membre 'message' n'est pas correctement
enregistré (ou lu...)

qqn saurait-il m'expliquer d'ou vient l'erreur ?


Je ne suis pas sur, mais j'ai un doute. Est tu sur que dans ton vrai code,
tu as

typedef struct PostMessageBox{

char message[256];
char titre[256];
UINT uType;

}PostMessageBox;


et pas

typedef struct PostMessageBox{
char *message;
char *titre;
UINT uType;
}PostMessageBox;

Et que tu malloque les message etc?.
Aussi, quelle est la taille de ton fichier apres ecriture d'une structure?
Il a l'air de quoi dans un editeur texte (ou hex)?
Tobias.

--
unix http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.programmer.html
clc http://www.eskimo.com/~scs/C-faq/top.html
fclc (french): http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
AG
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);
tu ne peux pas supposer que la disposition en mémoire de ta structure

sera la même que celle qui se trouve dans ton fichier, même si t'écris
en binaire. Il peut y avoir des bits de padding entre les membres de ta
structure, alors que dans ton fichier si ça se trouve, il n'y en pas.
Il faut lire le fichier, mettre le résultat dans une chaine de
charactère, et parser la chaîne pour remplir la structure.

[...]

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:

mon livre dit : "size_t fread(void *ptr,size_t size,size_t nobj,FILE
*stream);

fread lit sur le flot stream au plus nobj objets de taille size et les
places dans le tableau ptr. fread retourne le nombre d'objets lus...etc.."

j'ai de mon coté, une structure :

typedef struct PostMessageBox{

char message[256];
char titre[256];
UINT uType;

}PostMessageBox;

enregistrée dans un fichier par la fonction fwrite appelée ainsi :

PostMessageBox *BoxFile;
FILE *file_p;
file_p=fopen("box1.box","wb");
if(file_p)
{
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);


BoxFile n'a jamais été initialisé! Qu'espères-tu? Il ne dit rien ton
compilateur?

}
fclose(file_p);

et je la lis ainsi :

FILE *file_p;
size_t return_fread;
PostMessageBox BoxFile;

file_p=fopen(filepath,"rb");
if(file_p)
{
return_fread=fread(&BoxFile,sizeof(BoxFile),1,file_p);
}

fclose(file_p);


C'est déjà mieux!

le problème est qu'apperement le membre 'message' n'est pas correctement
enregistré (ou lu...)

qqn saurait-il m'expliquer d'ou vient l'erreur ?


Il faut fournir à fwrite() l'adresse d'un objet réel, pas une valeur de
pointeur fantaisiste. Tu l'as bien fait avec fread(), c'était par hasard?

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:



Nicolas aunai a écrit:
AG a écrit:
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);
tu ne peux pas supposer que la disposition en mémoire de ta structure

sera la même que celle qui se trouve dans ton fichier, même si
t'écris en binaire. Il peut y avoir des bits de padding entre les
membres de ta structure, alors que dans ton fichier si ça se trouve,
il n'y en pas. Il faut lire le fichier, mettre le résultat dans une
chaine de charactère, et parser la chaîne pour remplir la structure.

[...]



quoi ?? j'avais déjà fait ça un coup ça avait marché... :'(



Oui, ça marche tant que l'on ne change pas le fichier de machine, qu'on écrit
et lit dans les mêmes conditions etc.

c vraiment obligé se se prendre la tête avec tout ça ???



Si tu dois enregistrer des données devant être lues partout par n'importe
qui, oui. Un fichier texte pur est toujours lisible et même modifiable avec
un simple éditeur de texte. Pour les fichiers binaire, c'est déjà plus
space...

et puis franchement, je me demande quel est l'intéret d'enregistrer en
binaire si c pour se retaper des chaines a parser après... autant
directement enregistrer des chaines... doit y'avoir autre chose


Oui, c'est ce qu'on fait en général. Les format binaires sont 'fermés'
(exécutable, données confidentielles, formats propriétaires). Les formats
textes sont 'ouverts' (.ini, html, CSV etc.)

Il est aussi un avantage reconnu aux fichiers binaires, c'est qu'ils sont
plus compacts. (Important pour le multimedia, images, son, video etc.)

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/




Avatar
Nicolas aunai
bon je me rend compte que j'ai pas donné la solution, que j'ai trouvé plus
tard.....

<HS>
en fait, c une saleté de problème avec mon fichier ressource, un id
d'élément (la zone edit de 'message') qui avait chgé de nom, et pas dans le
.rc... du coup, ça risquait pas de le prendre dans la bonne zone, encore
moins de le mettre dans la structure, et donc pas l'enregistrer dans mon
fichier !
voila voila
</>


--
nico,
http://astrosurf.com/nicoastro
messenger : @hotmail.com
Avatar
Nicolas aunai
Emmanuel Delahaye a écrit:



Oui, ça marche tant que l'on ne change pas le fichier de machine,
qu'on écrit et lit dans les mêmes conditions etc.

c vraiment obligé se se prendre la tête avec tout ça ???



Si tu dois enregistrer des données devant être lues partout par
n'importe qui, oui. Un fichier texte pur est toujours lisible et même
modifiable avec un simple éditeur de texte. Pour les fichiers
binaire, c'est déjà plus space...


hum, si je te comprends, ça signifie que si je passe mon exe, et un fichier
que j'ai fait chez moi a qqn, il va pas réussir a le lire avec mon programme
? c la mort ce truc !!!


et puis franchement, je me demande quel est l'intéret d'enregistrer
en binaire si c pour se retaper des chaines a parser après... autant
directement enregistrer des chaines... doit y'avoir autre chose


Oui, c'est ce qu'on fait en général. Les format binaires sont 'fermés'
(exécutable, données confidentielles, formats propriétaires). Les
formats textes sont 'ouverts' (.ini, html, CSV etc.)

Il est aussi un avantage reconnu aux fichiers binaires, c'est qu'ils
sont plus compacts. (Important pour le multimedia, images, son, video
etc.)


oui mais alors ça me fait un peu ch... si un fichier fait chez moi n'est
"peut-etre" pas ouvrable et interprétable chez qqn d'autre


--
nico,
http://astrosurf.com/nicoastro
messenger : @hotmail.com



Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:

Oui, ça marche tant que l'on ne change pas le fichier de machine,
qu'on écrit et lit dans les mêmes conditions etc.

c vraiment obligé se se prendre la tête avec tout ça ???



Si tu dois enregistrer des données devant être lues partout par
n'importe qui, oui. Un fichier texte pur est toujours lisible et même
modifiable avec un simple éditeur de texte. Pour les fichiers
binaire, c'est déjà plus space...


hum, si je te comprends, ça signifie que si je passe mon exe, et un
fichier que j'ai fait chez moi a qqn, il va pas réussir a le lire avec
mon programme ? c la mort ce truc !!!


Non. Avec le même exe, pas de problèmes. Mais si tu recompiles sur une
machine unix, sparc, mac ou autre, les format binaire des données risque de
changer, les les fichiers risquent de ne plus être lisibles.

Il est courant que des machines hétéroclites soient reliées sur le même
réseau. Il faut bien un format commun. Le format texte est le plus simple.

Il y en a d'autres, mais aucun n'est natif en C. Il faut écrire
l'encodage/décodage soi-même selon des spécifications indépendantes du
langage et de la plateforme (par exemple ASN-1 etc.).

et puis franchement, je me demande quel est l'intéret d'enregistrer
en binaire si c pour se retaper des chaines a parser après... autant
directement enregistrer des chaines... doit y'avoir autre chose


Oui, c'est ce qu'on fait en général. Les format binaires sont 'fermés'
(exécutable, données confidentielles, formats propriétaires). Les
formats textes sont 'ouverts' (.ini, html, CSV etc.)

Il est aussi un avantage reconnu aux fichiers binaires, c'est qu'ils
sont plus compacts. (Important pour le multimedia, images, son, video
etc.)


oui mais alors ça me fait un peu ch... si un fichier fait chez moi n'est
"peut-etre" pas ouvrable et interprétable chez qqn d'autre


Si c'est le même exécutable (donc la même plateforme), pas de problème. Mais
ici, on est sur f.c.l.c., donc indépendant de la plateforme.

Si la plateforme est différente et que le programme a été porté (adaptations
systèmes + recompilation), les fichiers risquent de ne pas être lisible, et
on se demandera alors "comment relire lire ces mégaoctets de données
accumulés depuis 10 ans". (Question récurrente sur différents forums).

C'est pour ça qu'on préfère anticiper et éviter ça et qu'on choisit soit un
format texte (très portable) soit un format binaire indépendant de la
plateforme et parfaitement spécifié.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/




Avatar
Nicolas aunai
Emmanuel Delahaye a écrit:


Non. Avec le même exe, pas de problèmes. Mais si tu recompiles sur une
machine unix, sparc, mac ou autre, les format binaire des données
risque de changer, les les fichiers risquent de ne plus être lisibles.


aaaah ouf :)

Il est courant que des machines hétéroclites soient reliées sur le
même réseau. Il faut bien un format commun. Le format texte est le
plus simple.


oui ok, le plsu simple, mais certainement aussi le plus chiant a
interpréter.... pfff

Il y en a d'autres, mais aucun n'est natif en C. Il faut écrire
l'encodage/décodage soi-même selon des spécifications indépendantes du
langage et de la plateforme (par exemple ASN-1 etc.).


ok.

Si c'est le même exécutable (donc la même plateforme), pas de
problème. Mais ici, on est sur f.c.l.c., donc indépendant de la
plateforme.


et oui... :)

Si la plateforme est différente et que le programme a été porté
(adaptations systèmes + recompilation), les fichiers risquent de ne
pas être lisible, et on se demandera alors "comment relire lire ces
mégaoctets de données accumulés depuis 10 ans". (Question récurrente
sur différents forums).

C'est pour ça qu'on préfère anticiper et éviter ça et qu'on choisit
soit un format texte (très portable) soit un format binaire
indépendant de la plateforme et parfaitement spécifié.



ok je pige le principe ! mais bon, pour mes besoins et vu la petite appli
que je code je me prend pas la tête, ça n'est ni un programme qui vivra 10
ans... ni un programme destiné a la vente dans le monde entier, ni un
programme destiné a etre sur plein pleins de plateformes.... c surtout un
petit truc d'apprentissage !!

donc comme y'a que moi qui le compile... ça fait pas de soucis !

merci


--
nico,
http://astrosurf.com/nicoastro
messenger : @hotmail.com

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Nicolas aunai" @free.fr> wrote:

Si tu ne mets pas le bon code, difficile de t'aider...


ouais, en fait vu l'erreur ça aurai pas non plus été possible de la
trouver alors...


On aurait pu dire "le code est bon, il faut chercher ailleurs". Ca aide...

mais vois-tu je trouve que ya un truc pas cool avec les ng sur la prog,
c'est que... par exemple, regarde fclc JUST C QUESTIONS !! et pourtant,
il réuni qd meme des grosses têtes du C... d'un autre coté, t'as
fr.comp.os.ms-windows.programmation ou tu peux poster des trucs pas
standard (sur windows donc), mais le ng réuni tellement de choses que
forcément c moins spécialiste...


C'est à toi d'être clair dans ta tête et de bien dfférencier les problèmes de
langages et les problèmes de système. C'est pour ça qu'on insiste
/lourdement/ sur les limites de ce forum. /C'est/ pédagogique, même si
certains ne le supportent pas. Tant pis pour eux.

alors il est où le ng fr.comp.c.windows ?? hein ??


Il n'a pas de raison d'être, mais tu peux toujours essayer de le créer (sur
alt.fr.*, c'est plus simple)

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
rixed
C'est précisément ce genre de manip qui n'est pas portable, car l'image
binaire des données en mémoire se trouve recopiée brutalement (sans encodage
spécifique) dans le fichier binaire. Il faut absolument que le processus de
lecture soit symétrique. L'exécutable doit avoir été généré dans les mêmes
conditions.


Disons que c'est le fichier de data qui n'est pas portable.
Le source C, lui, peut parfaitement l'etre :-)