Pregunta Lectura y escritura de archivos binarios


Intento escribir código para leer un archivo binario en un búfer, y luego escribir el búfer en otro archivo. Tengo el siguiente código, pero el búfer solo almacena un par de caracteres ASCII de la primera línea del archivo y nada más.

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

75
2018-03-24 14:00


origen


Respuestas:


Si quieres hacer esto de la manera C ++, hazlo así:

#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 necesita esa información en un búfer para modificarla o algo, haga esto:

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

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );
    // copies all data into buffer
    std::vector<char> buffer((
            std::istreambuf_iterator<char>(input)), 
            (std::istreambuf_iterator<char>()));
}

136
2018-03-24 14:19



 sizeof(buffer) == sizeof(char*) 

Use longitud en su lugar.

Además, mejor usar fopen con "wb"....


13
2018-03-24 14:03



Aquí hay un pequeño ejemplo, el uso de C ++ rdbuf. Lo obtuve de la web. No puedo encontrar mi fuente original en esto:

#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
2018-03-24 17:07



sizeof (buffer) es el tamaño de un puntero en la última línea, NO el tamaño real del buffer. Necesita usar "longitud" que ya ha establecido


6
2018-03-24 14:01



Debería pasar la longitud a fwrite en lugar de sizeof (buffer).


4
2018-03-24 14:02



Hay una manera mucho más simple. Esto no importa si es un archivo binario o de texto.

Use 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
2018-05-10 01:14



En serio, no entiendo por qué alguien elige escribir un código tan complicado cuando puede suceder con comandos tan simples en el siguiente fragmento.

Copia todo el archivo de cualquier tamaño. ¡Sin restricción de tamaño!

Solo usa esto. ¡Probado y trabajando!

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
  ifstream infile;
  infile.open("source.pdf",ios::binary|ios::in);

  ofstream outfile;
  outfile.open("temppdf.pdf",ios::binary|ios::out);

  int buffer[2];
  while(infile.read((char *)&buffer,sizeof(buffer)))
  {
      outfile.write((char *)&buffer,sizeof(buffer));
  }

  infile.close();
  outfile.close();
  return 0;
}

Tener un tamaño de búfer más pequeño sería útil para copiar archivos pequeños. Incluso "char buffer [2]" haría el trabajo.


-2
2017-11-02 15:33