web-dev-qa-db-fra.com

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

Si vous voulez faire cela à la manière C++, procédez comme suit:

#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 autre chose, procédez comme suit:

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

}
157
Björn Pollex
 sizeof(buffer) == sizeof(char*) 

Utilisez plutôt la longueur.

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

14
Alexey Sudachén

Voici un court exemple, la méthode C++ utilisant rdbuf. Je l'ai eu sur le web. Je ne trouve pas ma source originale sur ceci:

#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;
}
13
Thomas Matthews

sizeof (tampon) 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

7
jcoder

Vous devriez passer la longueur dans fwrite au lieu de sizeof (tampon).

4
retrodrone

Il y a un moyen beaucoup plus simple. Cela n'a pas d'importance s'il s'agit d'un fichier binaire ou texte.

Utilisez noskipws.

char buf[SZ];
ifstream f("file");
int i;
for(i=0; f >> noskipws >> buffer[i]; i++);
ofstream f2("writeto");
for(int j=0; j < i; j++) f2 << noskipws << buffer[j];
0
Zeta