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 );
Réponses:
Si vous voulez faire cela à la manière C ++, procédez comme suit:
Si vous avez besoin de ces données dans un tampon pour les modifier ou quelque chose, procédez comme suit:
la source
char
est utilisé en C / C ++ pour stocker des octets (et ce depuis 40 ans). il est sûr de le faire, aussi longtemps que vous ne cherchez pas à réellement USE que les données sous forme de caractères (ne pas utiliser strlen () sur elle, ne pas imprimer à la console, etc.). c ++ 17 introduitstd::byte
à cet effet (qui est encore du caractère en faitchar
déguisé)Voici un court exemple, la manière C ++ utilisant
rdbuf
. J'ai obtenu ceci sur le Web. Je ne trouve pas ma source originale à ce sujet:la source
Utilisez plutôt la longueur.
Aussi, mieux utiliser
fopen
avec "wb
" ....la source
buffer.length()
for buffer peut avoir des valeurs NULL à l'intérieur, ce qui va à l'encontre de l'objectif de strlen / length ().sizeof(buffer)
.sizeof (buffer) est la taille d'un pointeur sur votre dernière ligne PAS la taille réelle du buffer. Vous devez utiliser la "longueur" que vous avez déjà établie à la place
la source
Vous devez passer length dans fwrite au lieu de sizeof (buffer).
la source
Il existe un moyen beaucoup plus simple. Cela ne se soucie pas s'il s'agit d'un fichier binaire ou texte.
Utilisez noskipws.
la source
Cela peut être fait avec des commandes simples dans l'extrait de code suivant.
Copie le fichier entier de n'importe quelle taille. Aucune contrainte de taille!
Utilisez simplement ceci. Testé et fonctionnel !!
Avoir une taille de tampon plus petite serait utile pour copier de petits fichiers. Même "char buffer [2]" ferait l'affaire.
la source
int[]
au lieu dechar[]
?char[]
également avec les fichiers de toute taille, ce qui signifie qu'il n'y a aucune condition selon laquelle la taille du fichier doit être un multiple de la taille du tampon.