2009-08-14 8 views
10

J'ai lu toujours et a dit que lorsqu'ils traitent des fichiers binaires que l'on doit utiliser read() et write() par opposition aux opérateurs < <et> > car ils sont destinés pour une utilisation avec des données formatées. J'ai aussi lu qu'il est possible de les utiliser, mais c'est un sujet avancé, que je ne peux pas trouver là où quelqu'un plonge et discute.C++ fstream << and >> opérateurs avec des données binaires

J'ai vu récemment un code qui a fait ce qui suit:

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

file1 << file2.rdbuf(); 

Lorsque je l'ai souligné l'utilisation de l'opérateur < < avec le fichier binaire, on m'a dit que l'appel rdbuf() retourne une streambuf * et que < < surcharge le streambuf * et effectue une copie directe sans formatage et est donc sûr.

Est-ce vrai et aussi sûr? Que diriez-vous d'efficacité? Des pièges? Les détails seraient très appréciés.

Merci!

Répondre

4

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

+3

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

+0

Ceci est une référence à un paragraphe de la norme. La norme elle-même n'est pas accessible au public. Certains brouillons sont mais je n'ai pas un lien facilement. – AProgrammer

+0

D'accord, merci de clarifier. Ils devraient rendre le public standard. – Skurmedel

3

C'est tout à fait sûr et un moyen raisonnable de copier des flux.

Notez qu'il permet aussi des choses comme:

std::ifstream file_in1("x1", ios_base::in | ios_base::binary); 
std::ifstream file_in2("x2", ios_base::in | ios_base::binary); 
std::ofstream file_out("y", ios_base::app | ios_base::binary); 

file_out << file_in1.rdbuf() << "\nand\n" << file_in2.rdbuf(); 
+0

C'est plutôt joli. – Skurmedel

+0

Avez-vous des détails sur les raisons pour lesquelles cela est sûr? Je sais que vous pouvez le faire et cela semble fonctionner, mais ma curiosité réside dans le fait qu'il est courant de voir où les références indiquent que << and > ne sont pas des données binaires. Par exemple cela fonctionne pour les fichiers texte qui sont ouverts en tant que binaire ainsi que pour les images tout de même? –

+0

<< and >> sont des opérateurs surchargés. C'est-à-dire qu'il existe 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 du streambuf est fondamentalement différente de toutes les autres. – MSalters

1

Au § 27.7.3.6.3 de la norme C++, il est mentionné que
basic_ostream<charT,traits>& operator<< (basic_streambuf<charT,traits>* sb);
Effects: Behaves as an unformatted output function (as described in 27.7.3.7, paragraph 1).

§ 27.7.3.7 décrit "entrée non formatée" qui est essentiellement une copie binaire. Cela signifie que les fonctions ostream "non formatées" sont sécurisées pour les données binaires. Les autres fonctions "non formatées" mentionnées dans la norme que je peux trouver sont put, write et (officiellement) flush.

Questions connexes