Ce n'ifstream::rdbuf ()?
J'ai le code suivant et ça marche plutôt bien (autre que le fait qu'il est assez lent, mais je n'aime pas beaucoup parler). Il ne me semble pas des plus intuitives que ce serait d'écrire la totalité du contenu de la infile à la outfile.
//Returns 1 if failed and 0 if successful
int WriteFileContentsToNewFile(string inFilename, string outFilename)
{
ifstream infile(inFilename.c_str(), ios::binary);
ofstream outfile(outFilename.c_str(), ios::binary);
if( infile.is_open() && outfile.is_open() && infile.good() && outfile.good() )
{
outfile << infile.rdbuf();
outfile.close();
infile.close();
}
else
return 1;
return 0;
}
Toute idée?
Je voudrais ajouter que les appels explicites à
close()
ne sont pas nécessaires. Les destructeurs ferait la même chose de toute façon. Et qui permet d'économiser quelques lignes. 😉OriginalL'auteur Brian T Hannan | 2010-01-26
Vous devez vous connecter pour publier un commentaire.
Oui, il est spécifié dans la norme et c'est en fait assez simple.
rdbuf()
retourne un pointeur vers le sous-jacentbasic_streambuf
objet pour le[io]stream
objet.basic_ostream<...>
a une surcharge pouroperator<<
pour un pointeur versbasic_streambuf<...>
qui écrit le contenu de labasic_streambuf<...>
.Je ne suis pas tout à fait sûr de ce que vous conduisez avec un chunk'? Il est spécifié à la sortie du contenu de l'souligné
streambuf
caractère par caractère jusqu'à la fin de la mémoire tampon est atteint ou il y a une erreur de la sortie. Lestreambuf
est une instance de classe et qu'il enregistre sa séquence contrôlée dans la mémoire contiguë ou non n'est pas spécifiée et ne peut pas être déduite à partir de l'interface.Donc, il y a 10 000 normes avec des noms bizarres que seules les personnes à l'ISO peuvent éventuellement comprendre ce qu'ils signifient. Non seulement vous ne savez pas ce que vous obtenez, mais il en coûte 300 $pour une véritable norme de l'ISO. C'est ridicule. Je veux juste savoir une simple petite chose et j'ai acheter un stupide standard. Cette information doit être libre et facilement accessibles afin que les gens peuvent faire un meilleur code. BOITEUX!!
T Hannan: Si vous lisez les réponses à la question vous trouverez des liens vers librement à disposition des projets de toutes les normes pertinentes. Ils seront très proche des standards actuels qui vont être les plus fiables libre de référence pour des réponses définitives.
Malenfant : Merci! Je cherchais au mauvais endroit. J'étais à la recherche dans le ifstream de la documentation, mais vraiment où est effectué le travail est en "ostream::operator<<" C'est beaucoup plus clair maintenant.
OriginalL'auteur CB Bailey
iostream
classes sont juste des wrappers autour de tampons d'e/S. Leiostream
lui-même n'a pas à faire beaucoup... surtout, il la fournitoperator>>
mise en forme des opérateurs. Le tampon est fourni par un objet dérivé debasic_streambuf
, que vous pouvez obtenir et de définir à l'aide derdbuf()
.basic_streambuf
est un résumé de la base avec un certain nombre de fonctions virtuelles qui sont remplacés pour fournir une interface uniforme pour la lecture/écriture de fichiers, cordes, etc. La fonctionbasic_ostream<…>::operator<<( basic_streambuf<…> )
est défini de manière à garder la lecture par le biais de la mémoire tampon jusqu'à ce que le sous-jacent de la source de données est épuisé.iostream
est un terrible gâchis.OriginalL'auteur Potatoswatter