OVH Cloud OVH Cloud

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 ?

1 réponse

1 2 3 4
Avatar
Bertrand Mollinier Toublet
Bertrand Mollinier Toublet wrote:
Christophe Le Gal wrote:

"toto"[0] = '', est-il du C pourri, ou n'est-il pas du C ?


Bah, pourri, pas pourri, c'est tres subjectif. C'est tout a fait correct
syntactiquement et semantiquement. Le style n'est pas forcement tres
approuve...

Woah la honte, he ! Je me suis fait avoir. Non, que je sois honnete:

j'ai temporairement fondu un fusible, et j'ai ecris n'importe quoi.
Pardon. Remplace le paragraphe ci-dessus par:

Non, ce code n'est pas pourri, il est incorrect. Tu essayes de modifier
une chaine litterale, ce qui invoque un UB. Tout peut arriver. Selon le
systeme que tu utilises il est probable que l'un des trois evenements
suivants arrivent:

a) ton programme plante avec une segfault ou equivelent (UNIXoide)
b) ca passe sans planter, mais si tu fais: "toto"[0] = '';
puts("toto"); l'output de ton programme sera "toto" (sans les
guillemets, bien sur)
c) ca passe sans planter, mais l'output de "toto"[0] = '';
puts("toto"); sera "" (i.e. une ligne vide), parce que ton compilateur a
factorise toutes les chaines litterales identiques en une seule (ce qui
est tout a fait legitime etant donne la supposition que les chaines
litterales sont non-modifiables).

Bref, je digresse. Au final, dans le contexte de ce NG, le comportement
de "toto" = ''; n'a pas d'importance. L'important est que c'est un UB
et que, pour du code portable, tu NE dois PAS faire des suppositions
quand a son comportement.

--
Bertrand Mollinier Toublet
int main(){char*strchr();int j34;char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.n",*i="iqgbgxmbbla.llsvoaz:";while
(*i){j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}


1 2 3 4