Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Renê Alves

Leitura byte á byte C

Recommended Posts

Estou no inicio da criação de um compressor de arquivo usando o código de huffman, estou com apenas um problema já procurei em vário lugares e não sei se o método que eu vou fazer dará certo.

 

Para fazer a leitura byte á byte, eu posso usar fgetc(); e depois converte-lo para um byte escrito em código binário?

Lembrando que isso não será apenas para comprimir .txt e sim arquivos maiores como, mp3, png e etc.

 

Já fiz um teste que com esse método de leitura um arquivo de 2.8mb ele consegue retornar 51 sequencia de bytes. Cálculos provam que isso está redondamente errado, porém não sei com qual função padrão de C devo fazer essa leitura.

 

Grato por quem puder contribuir!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, se você estiver abrindo o arquivo com

 

fopen("file.ext", "rb");

a leitura já é binária.

 

Como estes bytes são armazenados em variável char, eles são interpretados como texto ( Ficará um texto muito louco ) mesmo assim, poderá fazer a compressão. só não esqueça de na hora que gravar de usar

 

fopen("file.compress.ext", "wb");

 

Qualquer coisa poste algum pedaço do código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para comprimir arquivos binários e textos você terá que abri-lo para leitura em modo binário e usando uma variável do tipo unsigned int (int 32) para leitura dos dados.

Exemplo:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	FILE *fd = fopen(argv[1], "rb");
	unsigned int c;

	while ((c = fgetc(fd)) != EOF)
		write(STDIN_FILENO, &c, sizeof(c));

	fclose(fd);
	return 0;
}

Ou então pode ler com fread:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv)
{
	FILE *fd = fopen(argv[1], "rb");
	unsigned int c;

	while (!feof(fd))
	{
		memset(&c, 0x0, sizeof(c));
		fread(&c, sizeof(c), 1, fd);
		write(STDIN_FILENO, &c, sizeof(c));
	}

	fclose(fd);
	return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.