2011-03-24 32 views
68

Estoy tratando de 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.Lectura y escritura de archivos binarios

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

Debería decidir usar iostream o el manejo de archivos C. Por favor no use ambos. – frast

Respuesta

123

Si usted quiere hacer de esta manera el C++, hacerlo de esta manera:

#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 que los datos en un amortiguador para modificarlo o algo así, haga lo siguiente:

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

Me pregunto qué tan eficientes son estos? – Mikhail

+1

¿Qué pasa si quiero copiar solo un segmento de datos al búfer? ¿Cómo puedo hacerlo? Digamos 1024 bytes. – likern

+5

@Mikhail [Aquí] (http://insanecoding.blogspot.it/2011/11/how-to-read-in-file-in-c.html) puede encontrar algunos puntos de referencia. –

6

sizeof (buffer) es el tamaño de un puntero en su última línea, NO el tamaño real del búfer. Necesita usar "longitud" que ya estableció en su lugar

4

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

13
sizeof(buffer) == sizeof(char*) 

Use la longitud en su lugar.

También, mejor usar fopen con "wb" ....

+0

No se puede usar 'buffer.length()' para que el búfer tenga valores NULL dentro de él, lo que anula el propósito de strlen/length(). –

+0

Es mejor usar 'sizeof (buffer)'. –

12

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

El mejor método no portátil es permitir que el sistema operativo copie su archivo. Después de todo, eso es parte de lo que hace para ganarse la vida; No hay necesidad de reinventar la rueda*. –

+7

? ? ¿No hay espacios de nombres? ¿Qué es, los noventa? – BarbaraKwarc

+0

@BarbaraKwarc: actualizado según su solicitud. –

-3

serio, no entiendo por qué alguien elegiría para escribir un código tan complicada cuando puede ocurrir con una simple comandos tales en el siguiente fragmento.

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

Solo tiene que utilizar 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.

+6

¿Y si el tamaño del archivo no es múltiple del tamaño del búfer? Además, ¿por qué tienes que declarar tu buffer como 'int []' en lugar de 'char []'? – firegurafiku

Cuestiones relacionadas