OVH Cloud OVH Cloud

ofstream et fonction write template

78 réponses
Avatar
Aurélien REGAT-BARREL
Bonjour à tous,
Pour mes besoins j'ai défini une fonction write ainsi :

template<typename T>
void write( std::ofstream & Stream, T Value )
{
Stream.write( reinterpret_cast<char*>( &Value ), sizeof T );
}

void main()
{
std::ofstream OutFileStream;
OutFileStream.open( "test" );
int c = 10;
write( OutFileStream, c );
}

Je m'étonne qu'elle n'existe pas déjà dans la STL, ou même carrement en tant
que fonction membre de ofstream. Je pense plutôt que j'ai mal cherché.
Y'a-t-il un équivalent et si non pourquoi ?
Merci.

--
Aurélien REGAT-BARREL

10 réponses

Avatar
Michel Michaud
Dans news:, Gabriel
Non.
[...]

???
[...]

???
[...]

???
[...]

Non.


Jusque là, j'avoue que la qualité de tes arguments me laisse
bouche bée. :-|

Tu crois que restrict existait avant que printf ne soit inventé
pour C ?


??? (en fait, je peux répondre : non)

J'ai l'impression que tu vois plus dans mon message que ce
que j'ai écrit.


Tout ce que je crois, c'est que c'est une explication
fallacieuse. Je ne lis pas plus que ce que tu as écris.


Tu vois une explication de quoi exactement ? Je crois bien que
tu ne vois pas la bonne chose.

Pour le plaisir, je reprends le message complet avec ma réponse.

---------------
Parce qu'elle accepte un char*, et que autant je sais ce
qu'écrire un char veut dire, autant j'ignore ce que peut
vouloir dire écrire un void.


Ben fwrite le sait bien elle...


fwrite a été inventé pour C, avant que void* n'existe.
---------------

Je rappelle que la discussion était sur le pourquoi du char* en
C++ pour un paramètre qui est void* dans une fonction à peu
près équivalente de C.

Alors je répète ma réponse autrement et j'ajoute le reste de
ma pensée qui n'est, je l'avoue, qu'une conjecture :

- Le paramètre de fwrite n'était certainement pas
void* au départ car fwrite existait avant void*.

- Conjecture : aujourd'hui il est void* pour des raisons
historiques, pas parce que c'est une meilleure idée que le
char* de C++. C'était surtout pour ne pas casser le code
existant qui profitait du laxisme du C classique pour les
paramètres.

Ai-je besoin de te donner un cours de « Classic C » pour
t'expliquer comment les paramètres étaient « vérifiés » ?
Ce n'est pas long à expliquer !

En fait, je n'ai pas mes livres anciens ici, mais je ne serais
pas surpris que la documentation du fwrite original précise que
le paramètre est char*... En tout cas, c'est comme ça que je
l'aurais déclaré si j'avais eu à écrire la fonction à cette
époque.

Maintenant peut-être que tu éta^H^H connais quelqu'un qui était
sur le comité C à l'époque. Tu pourrais alors savoir que j'ai
tort et qu'en fait quelqu'un a demandé de mettre void* parce
que c'était « une très bonne idée »... Et cette personne était
absente au moment du développement de C++.

Ça me fera plaisir de m'instruire sur l'histoire de void* et
fwrite. Mais quand ta façon d'enseigner se limite à faire des
ah bon et des ???, moi je n'apprends rien.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans news:, Gabriel
| > Non.
| [...]
| > ???
| [...]
| > ???
| [...]
| > ???
| [...]
| > Non.
|
| Jusque là, j'avoue que la qualité de tes arguments me laisse
| bouche bée. :-|

Tu as la bouche bée parce que tu prends des interrogations pour des
arguments ? Fais attention quand même à ne pas avaler des mouches.
Ça transporte des tas de microbes ces bêtes là.

| > Tu crois que restrict existait avant que printf ne soit inventé
| > pour C ?
|
| ??? (en fait, je peux répondre : non)

Ah.

| >> J'ai l'impression que tu vois plus dans mon message que ce
| >> que j'ai écrit.
| >
| > Tout ce que je crois, c'est que c'est une explication
| > fallacieuse. Je ne lis pas plus que ce que tu as écris.
|
| Tu vois une explication de quoi exactement ? Je crois bien que
| tu ne vois pas la bonne chose.
|
| Pour le plaisir, je reprends le message complet avec ma réponse.

Ah, après l'avoir viré pour pouvoir envoyer un message sémantiquement
proche de void, tu crois devoir le remettre. Merci, tu es trop gentil.

| ---------------
| >> Parce qu'elle accepte un char*, et que autant je sais ce
| >> qu'écrire un char veut dire, autant j'ignore ce que peut
| >> vouloir dire écrire un void.
| >
| > Ben fwrite le sait bien elle...
|
| fwrite a été inventé pour C, avant que void* n'existe.
| ---------------
|
| Je rappelle que la discussion était sur le pourquoi du char* en
| C++ pour un paramètre qui est void* dans une fonction à peu
| près équivalente de C.

J'ai encore la discussion sous les yeux, merci.

|
| Alors je répète ma réponse autrement et j'ajoute le reste de
| ma pensée qui n'est, je l'avoue, qu'une conjecture :

Je soupçonnais bien compris que ta réponse initiale n'était aussi
qu'une conjecture. C'est pour cela que j'ai utilisé la politesse
« Ah bon ? », mais la suite montre que tu prefères la rudesse. Ainsi
soit-il.

| - Le paramètre de fwrite n'était certainement pas
| void* au départ car fwrite existait avant void*.
|
| - Conjecture : aujourd'hui il est void* pour des raisons
| historiques, pas parce que c'est une meilleure idée que le

Une histoire avec une boucle ?

Le paramètre de fwrite n'était certainement pas void* au départ
car fwrite existait avant void*. Aujourd'hui, elle prend void*
pour des raisons hisoriques.

Ahem, la ministre des centrales nucléaires n'aurait pas fait mieux.

| char* de C++. C'était surtout pour ne pas casser le code
| existant qui profitait du laxisme du C classique pour les
| paramètres.

Ah bon ?

| Ai-je besoin de te donner un cours de « Classic C » pour
| t'expliquer comment les paramètres étaient « vérifiés » ?

Cause toujours, comme tout le monde j'apprends tous les jours. Et puis
j'aime les cours d'histoire et les histoires.

| Ce n'est pas long à expliquer !

Mais alors, ne t'en prive pas.

| En fait, je n'ai pas mes livres anciens ici, mais je ne serais
| pas surpris que la documentation du fwrite original précise que
| le paramètre est char*... En tout cas, c'est comme ça que je
| l'aurais déclaré si j'avais eu à écrire la fonction à cette
| époque.

Ah mais, cela n'est pas ce la partie que je trouve intéressante.

| Maintenant peut-être que tu éta^H^H connais quelqu'un qui était
| sur le comité C à l'époque. Tu pourrais alors savoir que j'ai
| tort et qu'en fait quelqu'un a demandé de mettre void* parce
| que c'était « une très bonne idée »... Et cette personne était
| absente au moment du développement de C++.

Mais puique tu te proposes de me donner des cours de Classic C, c'est
que tu dois en connaître un bon bout sur la question. Ou te
proposais-tu juste de reciter ton bouquin de Classic C -- qui n'a
jamais vu une description précise dans un bouquin ?

| Ça me fera plaisir de m'instruire sur l'histoire de void* et
| fwrite. Mais quand ta façon d'enseigner se limite à faire des
| ah bon et des ???, moi je n'apprends rien.

Il semble que tu aies quelque difficulté à comprendre ce qu'est un
point d'interrogation. Je ne serais pas surpris si tu éprouvais aussi
des difficultés pour les autres caractères. Dans ce cas, ce qui
s'impose ce n'est pas un cours sur void*, mais un cours
d'alphabetisation. Je ne suis pas spécialiste dans ce domaine,
peut-être voudrais-tu contacter d'autres personnes qualifiées sur ces
points là.

-- Gaby
Avatar
kanze
Gabriel Dos Reis wrote in message
news:...
"Michel Michaud" writes:

| Dans news:41249c72$0$8970$, Aurélien

| >> Parce qu'elle accepte un char*, et que autant je sais ce
| >> qu'écrire un char veut dire, autant j'ignore ce que peut vouloir
| >> dire écrire un void.

| > Ben fwrite le sait bien elle...

| fwrite a été inventé pour C, avant que void* n'existe.

Ah bon ?


Je me rappelle bien de l'avoir vu dans les Unix version 7, qui est sorti
1979. Ce qui veut dire qu'elle existait avant. Or, dans une récente
discussion en fr.comp.lang.c, Stroustrup lui-même a été assez gentil
pour fournir une cronologie exacte des « void » (parce qu'il y en a
plusieurs) : selon lui, « [void* was] invented by me, Larry Rosler and
Steve Johnson about 1982. » (Stroustrup n'a pas posté directement
lui-même, mais je crois que je peux faire confidence à celui qui a posté
cet extrait de ne pas l'avoir inventé lui-même. N'est-ce pas, Gabi:-))

Mais peut-être j'ai mal compris la signification d'un « Ah bon » suivi
d'un point d'interrogation. Je l'ai compris d'être une mise en doute de
la phrase à laquelle elle s'applique ; donc, ici, une mise en doute soit
du fait que fwrite vient du C, soit qu'elle a existé avant void*.
Peut-être tu voulais dire quelque chose d'autre ?

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Gabriel Dos Reis
writes:

| Gabriel Dos Reis wrote in message
| news:...
| > "Michel Michaud" writes:
|
| > | Dans news:41249c72$0$8970$, Aurélien
|
| > | >> Parce qu'elle accepte un char*, et que autant je sais ce
| > | >> qu'écrire un char veut dire, autant j'ignore ce que peut vouloir
| > | >> dire écrire un void.
|
| > | > Ben fwrite le sait bien elle...
|
| > | fwrite a été inventé pour C, avant que void* n'existe.
|
| > Ah bon ?
|
| Je me rappelle bien de l'avoir vu dans les Unix version 7, qui est sorti
| 1979. Ce qui veut dire qu'elle existait avant. Or, dans une récente
| discussion en fr.comp.lang.c, Stroustrup lui-même a été assez gentil
| pour fournir une cronologie exacte des « void » (parce qu'il y en a
| plusieurs) : selon lui, « [void* was] invented by me, Larry Rosler and
| Steve Johnson about 1982. » (Stroustrup n'a pas posté directement
| lui-même, mais je crois que je peux faire confidence à celui qui a posté
| cet extrait de ne pas l'avoir inventé lui-même. N'est-ce pas, Gabi:-))

Je crois que Gaby, et non Gabi (à moins que tu t'adressais à Mme
Kanze), n'a pas inventé ce qu'il avait posté, mais cela n'a aucune
espèce d'importance ici. Mais, chacun cherche l'occasion de raconter
sa petite histoire, n'est-ce pas James ?

| Mais peut-être j'ai mal compris la signification d'un « Ah bon » suivi
| d'un point d'interrogation. Je l'ai compris d'être une mise en doute de
| la phrase à laquelle elle s'applique ; donc, ici, une mise en doute soit
| du fait que fwrite vient du C, soit qu'elle a existé avant void*.
| Peut-être tu voulais dire quelque chose d'autre ?

Rien d'autre, autre que ce que j'ai dit : une surprise en ce qui
concerne l'explication. Elle me semble fallacieuse.

Résumé rapide :

Aurélien: fwrite accepte un void *, pourquoi ostream::write ne fait
pas de même ?

Loic: Parce qu'elle accepte un char*, et que autant je sais ce
qu'écrire un char veut dire, autant j'ignore ce que peut
vouloir dire écrire un void.

Aurélien: Ben fwrite le sait bien elle...

Michel: fwrite a été inventé pour C, avant que void* n'existe.


Cet échange me paraît surréaliste et abracadabrantesque.

Loïc -- fwrite existe aussi en C++, avec la même sémantique qu'en C.
Un pointeur de type void* ne pointe pas sur void, mais sur un objet.
Donc, fwrite n'écrit pas une suite de void, mais une suite de
caractères. ostream::write pourrait faire de même, cf la question
d'Aurélien.

Michel -- le fait que fwrite existait avant void (donc prenait un
char*), mais prend de nos jours, depuis belle lurette, un void*
n'explique pas pourquoi ostream::write ne peut pas faire ce que fwrite
fait, accepter un void*. Au mieux, ton affirmation est incongrue.

James -- j'aime les histoires, mais celles qui sont appropriées au
contexte sont les plus appréciées.

-- Gaby
Avatar
Loïc Joly
Gabriel Dos Reis wrote:

Aurélien: fwrite accepte un void *, pourquoi ostream::write ne fait
pas de même ?

Loic: Parce qu'elle accepte un char*, et que autant je sais ce
qu'écrire un char veut dire, autant j'ignore ce que peut
vouloir dire écrire un void.
[...]


Loïc -- fwrite existe aussi en C++, avec la même sémantique qu'en C.
Un pointeur de type void* ne pointe pas sur void, mais sur un objet.
Donc, fwrite n'écrit pas une suite de void, mais une suite de
caractères. ostream::write pourrait faire de même, cf la question
d'Aurélien.


Continuons dans l'abracadabrantesquissime :

Je n'ai visiblement pas bien exprimé ma pensée. Oui, on aurait pu
définir ostream::write avec void*. Par contre, je trouve que la définir
avec char* est plus expressif.

Un (void* + un steamsize) pointe plus pour moi sur un tableau d'objets
que sur un objet, mais admettons. Donc si ostream::write prenait un
void* ce serait pour écrire un objet.
Maintenant, que veut dire écrire un objet ?

- Appeler l'opérateur << dessus ?
- Ecrire les différents chars qui composent sa mémoire les un après les
autres (dans quel ordre ?)
- Autre chose encore ?

Alors qu'en lui passant un char*, il me semble "naturel" (pour autant
que ce que cette expression veut dire en C++) d'en conclure qu'on lui
passe un tableau de char que l'on va écrire les uns après les autres.

--
Loïc

Avatar
Gabriel Dos Reis
Loïc Joly writes:

| Gabriel Dos Reis wrote:
|
| > Aurélien: fwrite accepte un void *, pourquoi ostream::write ne fait
| > pas de même ? Loic: Parce qu'elle accepte un char*, et
| > que autant je sais ce
| > qu'écrire un char veut dire, autant j'ignore ce que peut
| > vouloir dire écrire un void.
| [...]
| > Loïc -- fwrite existe aussi en C++, avec la même sémantique qu'en C.
| > Un pointeur de type void* ne pointe pas sur void, mais sur un objet.
| > Donc, fwrite n'écrit pas une suite de void, mais une suite de
| > caractères. ostream::write pourrait faire de même, cf la question
| > d'Aurélien.
|
| Continuons dans l'abracadabrantesquissime :
|
| Je n'ai visiblement pas bien exprimé ma pensée. Oui, on aurait pu
| définir ostream::write avec void*. Par contre, je trouve que la
| définir avec char* est plus expressif.

Je crois que je peux construire des arguments des deux côtés.

| Un (void* + un steamsize) pointe plus pour moi sur un tableau d'objets
| que sur un objet, mais admettons.

Un tableau d'objets est un objet.

Et, pour décrire l'étendu d'un objet, c'est sémantiquement équivalent
de passer une pair (void*, integer-type) ou (byte-type*,
integer-type).

| Donc si ostream::write prenait un
| void* ce serait pour écrire un objet.
| Maintenant, que veut dire écrire un objet ?

La même chose qie fwrite ?

| - Appeler l'opérateur << dessus ?

operator<< est traditionellement, réservé au formattage.

| - Ecrire les différents chars qui composent sa mémoire les un après
| les autres (dans quel ordre ?)

C'est que ce fait fwrite.

| - Autre chose encore ?

Y a-t-il une reélle urgence à vouloir inventer autre chose que la
sémantique naturelle, i.e. celle de fwrite?

| Alors qu'en lui passant un char*, il me semble "naturel" (pour autant
| que ce que cette expression veut dire en C++) d'en conclure qu'on lui
| passe un tableau de char que l'on va écrire les uns après les autres.

Bah, en utilisant ta logique plus haut, on pourrait tout aussi
concevoir qu'on appelle operator<< ou qu'on utilise des règles de
formattages abracabrantesques.

Pour écrire un objet, je trouverais plus naturel (puisque c'est le
mot), d'utiliser void* que d'utiliser char*. La raison est que char*
est déjà trop surchargé. Quand on voit passer un char*, on ne sait
pas si on doit supposer que c'est juste un pointeur dans un objet ou
un pointeur dans une chaîne de caractères terminée par le caractère
nul. De fait, void* a été inventé pour dire justement un pointeur dans
un objet -- dont le type n'a pas grande importance ; ce qui est
important, c'est la vision en tant que région de stockage. Cela est
justement ce qui se passe avec ostream::write et fwrite.

-- Gaby
Avatar
kanze
Gabriel Dos Reis wrote in message
news:...
writes:
| Gabriel Dos Reis wrote in message
| news:...
| > "Michel Michaud" writes:

| > | Dans news:41249c72$0$8970$, Aurélien

| > | >> Parce qu'elle accepte un char*, et que autant je sais ce
| > | >> qu'écrire un char veut dire, autant j'ignore ce que peut
| > | >> vouloir dire écrire un void.

| > | > Ben fwrite le sait bien elle...

| > | fwrite a été inventé pour C, avant que void* n'existe.

| > Ah bon ?

| Je me rappelle bien de l'avoir vu dans les Unix version 7, qui est
| sorti 1979. Ce qui veut dire qu'elle existait avant. Or, dans une
| récente discussion en fr.comp.lang.c, Stroustrup lui-même a été
| assez gentil pour fournir une cronologie exacte des « void » (parce
| qu'il y en a plusieurs) : selon lui, « [void* was] invented by me,
| Larry Rosler and Steve Johnson about 1982. » (Stroustrup n'a pas
| posté directement lui-même, mais je crois que je peux faire
| confidence à celui qui a posté cet extrait de ne pas l'avoir inventé
| lui-même. N'est-ce pas, Gabi:-))

Je crois que Gaby, et non Gabi (à moins que tu t'adressais à Mme
Kanze), n'a pas inventé ce qu'il avait posté, mais cela n'a aucune
espèce d'importance ici. Mais, chacun cherche l'occasion de raconter
sa petite histoire, n'est-ce pas James ?


J'avoue que je me suis un peu amusé à tes frais:-).

| Mais peut-être j'ai mal compris la signification d'un « Ah bon »
| suivi d'un point d'interrogation. Je l'ai compris d'être une mise en
| doute de la phrase à laquelle elle s'applique ; donc, ici, une mise
| en doute soit du fait que fwrite vient du C, soit qu'elle a existé
| avant void*. Peut-être tu voulais dire quelque chose d'autre ?

Rien d'autre, autre que ce que j'ai dit : une surprise en ce qui
concerne l'explication. Elle me semble fallacieuse.


OK.

En ce qui me concerne, je n'ai pas compris la rélévance de la phrase de
Michel. Mais elle était strictement correcte. C'est sans doute une
faiblesse de mon français, mais je me serais attendu plutôt à un « Et
alors ? » dans ce cas-là -- « Ah, bon ? » me semblait mettre en doute la
véricité de la phrase, et non qu'elle n'avait rien à dire avec la
question.

Pour la reste, tu aimes tellement me contradire quand je racconte mes
souvenirs. Alors, je te donnais encore une occasion:-). (En fait, je me
souviens assez bien que fwrite y était quand j'ai travaillé sur Unix
version 7.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Gabriel Dos Reis
writes:

[...]

| OK.
|
| En ce qui me concerne, je n'ai pas compris la rélévance de la phrase de
| Michel. Mais elle était strictement correcte. C'est sans doute une
| faiblesse de mon français, mais je me serais attendu plutôt à un « Et
| alors ? » dans ce cas-là -- « Ah, bon ? » me semblait mettre en doute la
| véricité de la phrase, et non qu'elle n'avait rien à dire avec la
| question.

Tu dois avoir raison.

-- Gaby
Avatar
Michel Michaud
Dans news:, Gabriel
Je soupçonnais bien compris que ta réponse initiale n'était
aussi qu'une conjecture. C'est pour cela que j'ai utilisé la
politesse
« Ah bon ? », mais la suite montre que tu prefères la rudesse.


Mauvaise conjecture. Je préfère les explications que les
insinuations. Comprenant maintenant que tout ce que tu
avais à dire étant du deuxième, je ne vois pas d'intérêt
à continuer. Je t'ai tout dit ce que j'avais à dire. Tu as
le droit de ne pas être d'accord. Comme tu ne trouves rien
à dire de précis pour expliquer ton désaccord, tu as gagné,
je ne peux te convaincre.

Ceci dit, je continue de penser que fwrite n'a pas été
inventé pour écrire des void*. Plutôt des char*. Mais j'ai
maintenant un doute sur le fait que c'était désiré : peut-
être que c'était simplement le « mieux » qui pouvait être
fait, puisque void* n'était pas une option. Je pense que
je vais carrément demander à Ritchie ce qu'il en pense...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Michel Michaud
Dans news:,
En ce qui me concerne, je n'ai pas compris la rélévance de la
phrase de Michel. Mais elle était strictement correcte. C'est


La « relevance » (pertinence) dans mon esprit était simplement
d'indiquer que fwrite n'ayant pas toujours eu void* dans sa
signature, ce n'était peut-être pas par choix qu'il a cette
signature aujourd'hui (c'est encore ce que je pense : pour ne
pas casser le code existant, on a mis void* au lieu de char*
quand on est passé à ISO C).

(Merci quand même de me dire clairement que tu trouves mon
affirmation strictement correcte... À force de voir les
commentaires de Gabriel, j'en étais moins sûr... bah, un peu
seulement...)

sans doute une faiblesse de mon français, mais je me serais
attendu plutôt à un « Et alors ? » dans ce cas-là -- « Ah, bon
? » me semblait mettre en doute la véricité de la phrase, et
non qu'elle n'avait rien à dire avec la question.


C'est exactement ce que j'ai pensé aussi. Mais nous avons
peut-être tous les deux mal interprété. Ou non ? Je ne sais
pas, je n'ai pas réussi à savoir...

Pour la reste, tu aimes tellement me contradire quand je
racconte mes souvenirs. Alors, je te donnais encore une
occasion:-). (En fait, je me souviens assez bien que fwrite y
était quand j'ai travaillé sur Unix version 7.)


Je me souviens très bien d'avoir utilisé fwrite en 1983-84
et je l'ai probablement utilisé en 1982 pour la première fois.


--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/