operaciones generar fichero escritura escribir ejemplos crear con como binarios binario archivos archivo c++ file binary buffer

c++ - generar - Lectura y escritura de archivos binarios



generar archivo binario c++ (7)

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


Aquí hay un pequeño ejemplo, la forma en C ++ que usa 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; }


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


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.


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


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


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


sizeof(buffer) == sizeof(char*)

Use longitud en su lugar.

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