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 );
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), {});
}
sizeof(buffer) == sizeof(char*)
Utilisez plutôt la longueur.
Aussi, mieux vaut utiliser fopen
avec "wb
" ....
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;
}
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
Vous devriez passer la longueur dans fwrite au lieu de sizeof (tampon).
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];