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

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

 #include  #include  #include  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(input), std::istreambuf_iterator( ), std::ostreambuf_iterator(output)); } 

Si necesita esa información en un búfer para modificarla o algo, haga esto:

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

Use longitud en su lugar.

Además, es mejor usar fopen con ” wb ” ….

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  #include  int main () { std::ifstream f1 ("C:\\me.txt",std::fstream::binary); std::ofstream f2 ("C:\\me2.doc",std::fstream::trunc|std::fstream::binary); f2< 

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

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

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

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 #include 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.