152 votes

Lecture et écriture de fichier binaire

J'essaie d'écrire du code pour lire un fichier binaire dans un tampon, puis d'écrire le tampon dans un autre fichier. J'ai le code suivant, mais le tampon ne stocke que quelques caractères ASCII de la première ligne du fichier et rien d'autre.

 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 );

240voto

Björn Pollex Points 41424

Si vous voulez faire cela à la manière du C++, faites-le comme ceci :

 #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));
}

Si vous avez besoin de ces données dans un tampon pour les modifier ou quelque chose, faites ceci :

 #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), {});

}

17voto

Thomas Matthews Points 19838

Voici un court exemple, à la manière du C++ en utilisant rdbuf . J'ai eu ça sur le web. Je ne trouve pas ma source d'origine à ce sujet :

 #include <fstream>
#include <iostream>

int main () 
{
  std::ifstream f1 ("C:\\me.txt",std::fstream::binary);

  std::ofstream f2 ("C:\\me2.doc",std::fstream::trunc|std::fstream::binary);

  f2<<f1.rdbuf();

  return 0;
}

15voto

Alexey Sudachen Points 344
 sizeof(buffer) == sizeof(char*) 

Utilisez plutôt la longueur.

Aussi, mieux vaut utiliser fopen avec " wb "....

10voto

jcoder Points 14982

sizeof(buffer) est la taille d'un pointeur sur votre dernière ligne PAS la taille réelle du tampon. Vous devez utiliser la "longueur" que vous avez déjà établie à la place

6voto

retrodrone Points 2979

Vous devez passer la longueur dans fwrite au lieu de sizeof(buffer).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X