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.
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 );
Respuestas:
Si desea hacer esto de la manera C ++, hágalo así:
Si necesita esos datos en un búfer para modificarlos o algo así, haga esto:
fuente
char
se utiliza en C / C ++ para almacenar bytes (y lo ha sido durante los últimos 40 años). es seguro hacerlo, siempre y cuando no intente UTILIZAR esos datos como caracteres (no use strlen () en ellos, no los imprima en la consola, etc.). c ++ 17 se presentastd::byte
para este propósito (que todavía es charchar
en realidad disfrazado)Aquí hay un breve ejemplo, la forma en que C ++ usa
rdbuf
. Obtuve esto de la web. No puedo encontrar mi fuente original en esto:fuente
En su lugar, utilice la longitud.
Además, es mejor usarlo
fopen
con "wb
" ....fuente
buffer.length()
para el búfer puede tener valores NULL dentro de él, lo que anula el propósito de strlen / length ().sizeof(buffer)
.sizeof (búfer) es el tamaño de un puntero en su última línea NO el tamaño real del búfer. En su lugar, debe usar la "longitud" que ya estableció
fuente
Debe pasar longitud a fwrite en lugar de sizeof (búfer).
fuente
Hay una forma mucho más sencilla. A esto no le importa si es un archivo binario o de texto.
Utilice noskipws.
fuente
Se puede hacer con comandos simples en el siguiente fragmento.
Copia el archivo completo de cualquier tamaño. ¡Sin restricciones de tamaño!
Solo usa esto. Probado y funcionando !!
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.
fuente
int[]
lugar dechar[]
?char[]
archivos de cualquier tamaño, lo que significa que no hay condición de que el tamaño del archivo sea un múltiplo del tamaño del búfer.