Jump to content

Recommended Posts

Posted

Bom dia a todos!

Gostaria de pedia uma ajudinha aqui no fórum. É o seguinte.

tenho um arquivos binário de (9175867 bytes),
preciso ler apenas (75867) bytes deste arquivo, e em pedaços de (1024 bytes) por vez, não quero jogar  (75867 bytes)  todo em um buffer na memória.
Com posso fazer isso com a função fread()?
Se alguém poder me ajudar desde já agradeço muito valeu. 

  • Agradecer 1
Posted

Antes, um detalhe: A função fread() lida com um stream e streams existem para acesso a blocos de dados de forma bufferizada. Como fread() faz uma leitura binária especificamente para um buffer apontado na função, não há muito sentido em usar streams (embora a função exista e possa ser usada), nesse caso. Recomendo o uso de do wrapper para a syscall (Unix like) read().

Anyway... Basta calcular quantos blocos de 1024 bytes tem o bloco que quer ler e calcular quantos bytes "restam" no bloco final (note que nem 75867, nem 9175867, são múltiplos de 1024!)... Daí você lê os blocos individuais, atualizando o ponteiro para onde esses dados serão lidos.

Como isso ai me cheira a exercício escolar, não postarei um código de exemplo.
 

  • Agradecer 1
Posted

Boa tarde

 

Veja: fread | Microsorft Learn

Basta-me ler a descrição desta função naquele manual (na apostila), e daí conhecerá sua especificação e, portanto, terá conhecimento de uso; limitação, falha ou problema. Para ler aqueles kilobytes (1024 bytes) por vez, necessito da compreensão dos operadores aritméticos, operadores lógicos e, pelo menos, uma das instruções de repetição. 

 

Com isso em mente, faça uma tentativa, depois poste aqui.

 

  • Agradecer 1
Posted

Valeu pessoal pela ajuda, já consegui aqui o que queria.

Talvez eu tenho me expressado errado no post. É assim que eu queria.

preciso ler "file1.dat 26,3 MB (27.648.054 bytes)" que está no arquivo 
"binfile.bin 2,53 GB (2.726.166.528 bytes)", este arquivo "file1.dat" 
está na posição 500 do arquivo "binfile.bin".
Não quero jogar todos os 27648054 bytes em um buffer, quero ler em pedaços de 16384,
e ir gravando em pedaços também.

Consegui fazer assim: veja o exemplo abaixo.

Este código para compactar arquivos de   tipo images, audios,  gráficos e outros de jogo 2D que estou criando, em um único arquivos e criptografado.

Já fiz tudo certo do jeito que eu queria, lendo o pedaços em buffes mas deu um pouco de delay para extrair images no jogo em tempo de execução.

Por isso vou tentar agora ler do HD e jogar para memoria de video direto sem jogar pra memoria RAM em "buffer".

int main() {

	FILE* in = fopen("D:/bACKUP_HDD_USB/binfile.bin", "rb"); // 2,53 GB (2.726.166.528 bytes)
	FILE* out = fopen("file1.bmp", "wb");
int chunk = 16384;
char* buf = new char[chunk];
int ret = 0, ret2 = 0;
int size_file = 27648054; // tamando que quero ler.
int ok = 0;
int have = 0;

fseek(in, 500, SEEK_SET);

while (!feof(in) && (ok != 1))
{
	ret = fread(buf, 1, chunk, in);
	ret2 += ret;
	int have = ret;
	if (ret2 > size_file) {			     // se ler mais que o tamanho desejado que no caso é "size_file".
		ret2 = -(size_file - ret2);  // subtrai do "size_file" total que já foi lido em "ret2",
									           // se der valor negativo, é convertido em  positivo pela procendência de sinais.  
		have = (chunk - ret2);		// "have" recenbe o restate de bytes necessário pra completar o total "size_file" .
		ok = 1;
	}		
	fwrite(buf, 1, have, out);
}
fclose(out);
fclose(in);
	return 0;
}

Se alguém ai der uma ideia melhor como fazer, agradeço muito.

 

  • Agradecer 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...