11
votes

C ++ FRStream << et >> Opérateurs avec des données binaires

J'ai toujours lu et on m'a dit que lors de la gestion des fichiers binaires que l'on devrait utiliser lecture () et écrire () par opposition aux opérateurs > car ils sont destinés à être utilisés avec des données formatées. J'ai également lu qu'il est également possible de les utiliser, mais c'est un sujet avancé, que je ne trouve pas où que quiconque plonge et discute.

J'ai récemment vu du code qui a procédé à ce qui suit: p>

 std::ifstream file1("x", ios_base::in | ios_base::binary);
 std::ofstream file2("y", ios_base::app | ios_base::binary);

 file1 << file2.rdbuf();


0 commentaires

3 Réponses :


4
votes

Oui (voir 27.6.2.5.3/6 où la surcharge de << pour Streambuf est décrite).


5 commentaires

Est-ce une page dans la norme ou quoi? :) Un lien serait bien!


Ceci est une référence à un paragraphe de la norme. La norme elle-même n'est pas disponible publiquement. Certains brouillons sont mais je n'ai pas de lien à la main.


D'accord, merci de clarifier. Ils devraient faire le public standard.


Vendre c'est comme ça qu'ils font leur argent, alors improbable. Serait bien que je suis d'accord. Le tirage tardive pour la version 98 est disponible sur ftp.research.att .Com / PUB / C ++ STD / WP / CD2


Qui est "ils"? L'ISO et les organismes nationaux ne sont pas une organisation de profit. L'argent qu'ils obtiennent de la vente de normes paient leurs coûts opérationnels et des normes populaires en fait le soutien moins populaire. Les personnes sur le comité et leur employeur soutiennent déjà le processus en donnant leur temps, en accordant leur voyage et à leur hébergement pour les réunions, parrainant la réunion afin que les salles etc. sont disponibles et souvent en payant une cotisation. L'arrangement n'est pas vraiment conçu pour PL, mais PL est destiné à ces organisations un domaine particulier et de faire des exceptions qui ne leur permettent pas.



3
votes

C'est tout à fait sûr et à une manière raisonnable de copier des flux.

Notez qu'il permet également de créer des choses comme: xxx


2 commentaires

Avez-vous des détails sur la raison pour laquelle c'est sûr? Je sais que vous pouvez faire cela et cela semble fonctionner, mais ma curiosité réside dans le fait que c'est une chose commune de voir où les références indiquent que << et >> ne sont pas pour des données binaires. Par exemple, cela fonctionne-t-il pour les fichiers texte ouverts aussi binaires que pour les images identiques?


<< et >> sont des opérateurs surchargés. C'est-à-dire que de nombreuses implémentations sont de nombreuses implémentations. En général, ceux-ci sont destinés au texte et formateront leur deuxième opérande. Cependant, la surcharge de Streambuf est fondamentalement différente de tous les autres.



1
votes

au § 27.7.3.6.3 de la norme C ++, il a été mentionné que
basic_ostream & opérateur << (BASIC_STREAMBUF * SB);
Effets: se comporte comme une fonction de sortie non formatée (comme décrit dans 27,7.3,7, paragraphe 1).
§ 27.7.3.7 décrit "l'entrée non formatée" qui est fondamentalement une copie binaire. Cela signifie que les fonctions «non formatées» d'Otstream sont sans danger pour les données binaires. Les autres fonctions "non formatées" mentionnées dans la norme que je peux trouver sont mettre , écrire et (officiellement) flush . .


0 commentaires