Maison >développement back-end >C++ >Pourquoi mon fichier binaire n'est-il copié que partiellement et comment puis-je y remédier ?

Pourquoi mon fichier binaire n'est-il copié que partiellement et comment puis-je y remédier ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-14 00:06:11407parcourir

Why Does My Binary File Copy Only Partially, and How Can I Fix It?

Lecture et écriture de fichiers binaires

La lecture et l'écriture de fichiers binaires impliquent de travailler avec des données brutes, souvent constituées de codes binaires représentant différents types de données . Une tâche courante consiste à lire les données d'un fichier binaire dans un tampon, puis à les écrire dans un autre fichier.

Problème :

Lors de la tentative de lecture et d'écriture d'un fichier binaire fichier en utilisant le code suivant, seuls quelques caractères ASCII de la première ligne du fichier sont stockés dans le buffer :

int length;
char * buffer;

ifstream is;
is.open ("C:\Final.gif", ios::binary );
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
is.read (buffer,length);
is.close();

FILE *pFile;
pFile = fopen ("C:\myfile.gif", "w");
fwrite (buffer , 1 , sizeof(buffer) , pFile );

Solution :

Il existe deux manières possibles de résoudre ce problème :

Utiliser des flux C :

Cette méthode implique d'utiliser les classes ifstream et ofstream fournies par la bibliothèque standard C. Il permet une gestion efficace et portable des fichiers.

#include <fstream>
#include <iterator>
#include <algorithm>

int main()
{
    std::ifstream input( "C:\Final.gif", std::ios::binary );
    std::ofstream output( "C:\myfile.gif", std::ios::binary );

    std::copy( 
        std::istreambuf_iterator<char>(input), 
        std::istreambuf_iterator<char>( ),
        std::ostreambuf_iterator<char>(output));
}

Utilisation d'un tampon pour la modification :

Si les données doivent être manipulées ou modifiées avant de les écrire dans un fichier, un tampon peut être utilisé pour le stocker.

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
    std::ifstream input( "C:\Final.gif", std::ios::binary );

    // copies all data into buffer
    std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(input), {});

}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn