Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ecrire une structure dans un fichier binaire

31 réponses
Avatar
citrouille
En fait, j'ai une structure très simple que je veux écrire dans un
fichier :

typedef struct{
char *txt;
int x;
}TEST;


Ecriture dans le fichier :

TEST *t = (TEST *)malloc(sizeof(TEST));
FILE *file;

t->txt = "pouet pouet";
t->x = 257;

file = fopen("fichier_test", "rb");
write(file, t, sizeof(TEST));
fclose(file);

Quand je regarde le fichier créé avec un éditeur héxadécimal, je
constate que ma chaine de caractere n'est pas enregistré, mais
seulement son adresse (je pense), car j'ai beau changer la chaine,
c'est toujour la meme chose d'enregistré. tandi que le int lui est
bien enregistré dans le fichier.

Pourrais-je avoir la bonne technique pour faire bien cette écriture ?

10 réponses

1 2 3 4
Avatar
Shamil
÷ ÐÉÓØÍÅ Thu, 14 Aug 2003 01:46:48 -0700, ztn ÎÁÐÉÓÁÌ:

Pour simplifier le truc:

TEST *t = (TEST *)malloc(sizeof(TEST));
FILE *file;

t->txt = "pouet pouet";
t->x = 257;

file = fopen("fichier_test", "rb");
write(file,t->txt, strlen(t->txt));

write(file,&t->x, sizeof(int));
fclose(file);


Avatar
Stephane Legras-Decussy
"Raphael Marinier" a écrit dans le message news:
3f3bc976$0$16179$

Avec ton raisonnement on ne pourrait pas faire :
char *chaine = "pouet pouet";


char *chaine=" pouet pouet" ; OK

mais

char * chaine ;
chaine = "pouet pouet"; NON

Avatar
Richard Delorme


"Raphael Marinier" a écrit dans le message
news: 3f3bc976$0$16179$

Avec ton raisonnement on ne pourrait pas faire :
char *chaine = "pouet pouet";


char *chaine=" pouet pouet" ; OK

mais

char * chaine ;
chaine = "pouet pouet"; NON


pourquoi non ?

char tableau[] = "hello"; // ok. "hello" est copié dans tableau.
tableau = " pouet pouet"; // incorrect, tableau n'est pas un pointeur.

mais

char *chaine = "salut"; // ok.
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.
chaine = tableau; // toujours ok.
chaine = malloc(123); // ok.

chaine est un pointeur, et il peut changer de valeur n'importe quand.
Les chaînes littérales peuvent se trouver n'importe où dans le code, pas
seulement dans les initialisations.

--
Richard


Avatar
Christophe Le Gal
In article <3f3c05c4$0$9626$,
Richard Delorme wrote:
char *chaine = "salut"; // ok.
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.
chaine = tableau; // toujours ok.
chaine = malloc(123); // ok.


Pour en rajouter une couche :
"toto"[0] = 'T' ; // ok
strcpy("toto", "tutu") ; //ok
strcpy("toto", chaine) ; //ok

Mais
"toto" = "tutu" ; // non
"toto" = chaine ; // non

enfin, j'ai pas verifie la norme, mais
je ne vois pas pourquoi ca ne serait pas le cas, et en tous cas
ca se passe comme ca avec gcc.
"toto" est un char *, au meme titre que 1 est un int.
C'est une constante char * donc.
Avec une difference par rapport a 1, qui est que sa valeur
correspond a l'adresse d'une zone de memoire qui contiendra
les caracteres t, o, t, o, au chargement du programme.

Chez moi la compilation de strcpy("toto", "tutu"), si elle
se passe sans le moindre warning, genere un programme dont l'execution
provoque, on s'en doutait un peu, un Segmentation fault.

Mais je suis sur que dans le passe j'ai deja fait qqchose du genre
printf("Gunaydin dunyan") ;
strcpy("Gunaydin dunyan", "Hello worldn") ;
printf("Gunaydin dunyan") ;

avec suivant les compilo est les plateformes des resultats differents :
parfois le 2e printf affiche "Gunaydin dunyan", parfois "Hello worldn".
Ca depend si le compilo est assez malin pour creer une seule fois
la chaine ou non.

--
Christophe Le Gal

Avatar
Anh Vu Tran
Shamil wrote:
÷ ÐÉÓØÍÅ Thu, 14 Aug 2003 01:46:48 -0700, ztn ÎÁÐÉÓÁÌ:

Pour simplifier le truc:


TEST *t = (TEST *)malloc(sizeof(TEST));



On ne caste pas le malloc sur les compilateurs pas trop
archai"ques, i.e. ceux qui reconnaissent le void *

FILE *file;

t->txt = "pouet pouet";
t->x = 257;

file = fopen("fichier_test", "rb");



file = fopen("fichier_test", "wb"); pour ouvrir en e'criture.

write(file,t->txt, strlen(t->txt));
write(file,&t->x, sizeof(int));


Attention, avec fopen, il faut utiliser les fonctions
fread, fwrite, f... :

fwrite(t->txt, strlen(t->txt)+1, 1, file);
fwrite(&t->x, sizeof(int), 1, file);

fclose(file);




Ca c'est pour le poisson.

Pour pe^cher : t (le pointeur sur un TEST) ne contient pas
la chaine pointe'e par t->txt dans le sens ou` son adresse
en me'moire n'est pas dans la structure elle-me^me. t->txt
est une re'fe'rence vers une chai^ne qui existe quelque part
en me'moire, c'est pour cela qu'il faut appeler la fonction
fwrite a` part pour la chai^ne. Il faut proce'der de me^me pour
tous les pointeurs d'une structure.

Il existe un moyen de pouvoir tout e'crire d'un coup, c'est
d'utiliser :

#define TAILLE_MAX 40

typedef struct{
char txt[TAILLE_MAX];
int x;
}TEST;

/* code... */

TEST *t = malloc(sizeof(TEST));
FILE *file;

strcpy(t->txt, "pouet pouet");
t->x = 257;

file = fopen("fichier_test", "wb");
fwrite(t, sizeof(TEST), 1, file);
fclose(file);

(Les puristes vont critiquer que ce n'est pas portable)
Dans ce cas, un seul appel a` fwrite suffit pour e'crire toutes
les informations utiles dans le fichier puisque l'espace
pour la chai^ne est re'ellement alloue' dans la structure.
L'inconve'nient de cette me'thode est que l'on doit se de'finir
une taille limite fixe pour la chai^ne de caracte`re.

Anh Vu


Avatar
Anh Vu Tran
Anh Vu Tran wrote:

Pour pe^cher [...]


Excusez-moi pour les accents, mon mozilla a complètement
déconné pour l'encodage des caractères...

Anh Vu

Avatar
Jean Claude Calvez
"Anh Vu Tran" a écrit dans le message
news: 3f3c6a1b$0$16157$
Anh Vu Tran wrote:

Pour pe^cher [...]


Excusez-moi pour les accents, mon mozilla a complètement
déconné pour l'encodage des caractères...


Bah ! ça restait lisible ! En tout cas plus que le cyrillique (je crois)
de Shamil !
( "? ?????? Thu, 14 Aug 2003 01:46:48 -0700, ztn ???????:" )


Anh Vu



--

Jean Claude Calvez



Avatar
Anh Vu Tran
Jean Claude Calvez wrote:

"Anh Vu Tran" a écrit dans le message
news: 3f3c6a1b$0$16157$

Anh Vu Tran wrote:


Pour pe^cher [...]


Excusez-moi pour les accents, mon mozilla a complètement
déconné pour l'encodage des caractères...



Bah ! ça restait lisible ! En tout cas plus que le cyrillique (je crois)
de Shamil !
( "? ?????? Thu, 14 Aug 2003 01:46:48 -0700, ztn ???????:" )


Je vois bien les caractères russes dans le post de Shamil,
et c'est pour que mozilla a basculé sur l'encodage cyrillique...

Anh Vu



Avatar
Shamil
D'apres KGB vous, Anh Vu Tran, avez écrit:

Bah ! ça restait lisible ! En tout cas plus que le cyrillique (je crois)
de Shamil !
( "? ?????? Thu, 14 Aug 2003 01:46:48 -0700, ztn ???????:" )


Je vois bien les caractères russes dans le post de Shamil,
et c'est pour que mozilla a basculé sur l'encodage cyrillique...

Anh Vu


mea culpa, c'est mon lecteur de news pan qui se trompe des fois du
profile et met celui que j'utlise pour le serveur russe ;)


--
Virtuellement votre


Avatar
Stephane Legras-Decussy
"Richard Delorme" a écrit dans le message news:
3f3c05c4$0$9626$
chaine = " pouet pouet"; // correct.
chaine = "truc bidule machin chose"; //encore correct.


ok...les bras m'en tombent....

je me trimbalais cette certitude depuis toujours...
la honte... :-(

1 2 3 4