Ir para conteúdo

Ler arquivos com fread() em pedaços.


cgm2k7

Posts Recomendados

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...