Estou tentando escrever um código para ler um arquivo binário em um buffer e, em seguida, gravar o buffer em outro arquivo. Eu tenho o seguinte código, mas o buffer armazena apenas alguns caracteres ASCII da primeira linha do arquivo e nada mais.
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 );
Respostas:
Se você quiser fazer isso da maneira C ++, faça assim:
Se você precisar desses dados em um buffer para modificá-lo ou algo assim, faça o seguinte:
fonte
char
é usado em C / C ++ para armazenar bytes (e tem sido nos últimos 40 anos). é seguro fazer isso, contanto que você não tente realmente USAR esses dados como caracteres (não use strlen () nele, não imprima no console, etc). c ++ 17 apresentastd::byte
para este propósito (que ainda está char,char
na verdade , disfarçado)Aqui está um pequeno exemplo, a maneira de usar C ++
rdbuf
. Peguei isso na web. Não consigo encontrar minha fonte original sobre este:fonte
Em vez disso, use o comprimento.
Além disso, é melhor usar
fopen
com "wb
" ....fonte
buffer.length()
para buffer pode ter valores NULL dentro dele, anulando assim o propósito de strlen / length ().sizeof(buffer)
.sizeof (buffer) é o tamanho de um ponteiro na sua última linha NÃO o tamanho real do buffer. Você precisa usar o "comprimento" que você já estabeleceu em vez
fonte
Você deve passar o comprimento para fwrite em vez de sizeof (buffer).
fonte
Existe uma maneira muito mais simples. Isso não importa se é um arquivo binário ou de texto.
Use noskipws.
fonte
Isso pode ser feito com comandos simples no seguinte trecho.
Copia todo o arquivo de qualquer tamanho. Sem restrição de tamanho!
Apenas use isso. Testado e funcionando !!
Ter um tamanho de buffer menor seria útil para copiar arquivos minúsculos. Até mesmo "char buffer [2]" faria o trabalho.
fonte
int[]
vez dechar[]
?char[]
arquivos de qualquer tamanho, o que significa que não há condição de que o tamanho do arquivo seja um múltiplo do tamanho do buffer.