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 ?
typedef struct PostMessageBox{
char message[256];
char titre[256];
UINT uType;
}PostMessageBox;
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 ?
typedef struct PostMessageBox{
char message[256];
char titre[256];
UINT uType;
}PostMessageBox;
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 ?
typedef struct PostMessageBox{
char message[256];
char titre[256];
UINT uType;
}PostMessageBox;
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);
tu ne peux pas supposer que la disposition en mémoire de ta structure
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);
tu ne peux pas supposer que la disposition en mémoire de ta structure
fwrite(BoxFile,sizeof(*BoxFile),1,file_p);
tu ne peux pas supposer que la disposition en mémoire de ta structure
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 ?
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 ?
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 ?
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é... :'(
c vraiment obligé se se prendre la tête avec tout ça ???
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
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é... :'(
c vraiment obligé se se prendre la tête avec tout ça ???
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
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é... :'(
c vraiment obligé se se prendre la tête avec tout ça ???
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, ç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.)
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.)
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.)
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
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
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
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.).
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é.
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.).
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é.
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.).
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é.
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...
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...
alors il est où le ng fr.comp.c.windows ?? hein ??
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...
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...
alors il est où le ng fr.comp.c.windows ?? hein ??
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...
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...
alors il est où le ng fr.comp.c.windows ?? hein ??
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.
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.
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.