Ler ficheiro byte a byte em c

zbenta

Power Member
Boas minha gente,

Alguém me pode dar uma dica sobre como ler um ficheiro byte a byte em c e comparar cada byte lido com o anterior e com uma sequência de bytes (01001110)que serve de delimitador da informação contida no ficheiro.
O ficheiro pode ser de qualquer tipo, texto, video, image, etc..
Um exemplo simples já ajudava.
 
Podes usar um fgetc para ir buscar um carater de cada vez ao ficheiro...
Depois é só comparar com a sequencia pretendida para ver se dá certo ou não
 
Podes usar um fgetc para ir buscar um carater de cada vez ao ficheiro...
Depois é só comparar com a sequencia pretendida para ver se dá certo ou não

o fgetc seria váliado apenas para caracteres, pelo que, como referiu o Aparicio, se deve enveredar pelo uso de fread, fseek, fwrite, etc, tudo funções que trabalham sobre binário.
 
o fgetc seria váliado apenas para caracteres, pelo que, como referiu o Aparicio, se deve enveredar pelo uso de fread, fseek, fwrite, etc, tudo funções que trabalham sobre binário.

Ya mas cada caracter é um simbolo da tabela ASCII, mesmo que não seja "printable", que são os caracters a-z, A-Z e 0-9, e mais uns com acentos e afins.

Esprimentem fazer:
char x;
for(x=1; x<227; x++)
printf("%d - %c\n", x, x);
Com esta linha de código vê-se todos os caracteres que as variaveis char podem ter, incluindo espaços, tabs, mudança de linhas, caracteres especiais (como os smiles e assim), por ai fora.

Cada caracter diferente tem tem um numero da tabela ASCII logo se incrementarmos um char ele passa para o caracter asseguir na tabela.



Ou seja com o fgetc() vai dar para fazer o que o autor do tópico pretende.
 
Vai dar para fazer, mas dar não significa que se deva.
O fgetc deve-se utilizar para ler caracteres, o autor do tópico referia "qualquer tipo, texto, video, image, etc..", pelo que pode muito bem não ser caracteres.
 
Ou seja com o fgetc() vai dar para fazer o que o autor do tópico pretende.

tanto pode dar maravilhosamente como haver asneira da grossa. é por estas e por outras que depois há pontes que caem :P

o zbenta quer ler um ficheiro byte a byte, comparando cada byte com o anterior, recursivamente, e com uma sequência em binário.

ainda não percebi bem se queres ler o ficheiro todo mesmo ou só até chegar aquela sequência.
de qualquer das maneiras parece-me que a base do que tens de fazer é:
- sacar o tamanho do ficheiro através do ftell;
- criar um ciclo que leia desde o byte 0 até ao último byte através do fread. na leitura de cada byte, guarda-lo como sendo um short int e convertes o valor lido para binário. ainda em cada situação de leitura comparas então o binário do byte actual com o do anterior e com aquele específico que te indica o fim de informação.

caso queiras parar a leitura no byte que te indica o fim de informação é só indicar para fazer um break no ciclo quando a leitura for igual à sequência específica.

na possibilidade de quereres reescrever o ficheiro sem a informação depois do "byte final" usas o fwrite após cada leitura cíclica.talvez precises de recorrer ao fseek.

aconselho a leitura e compreensão do funcionamento das funções para manipular binário :P

http://www.cplusplus.com/reference/clibrary/cstdio/fseek.html
http://www.cplusplus.com/reference/clibrary/cstdio/ftell.html
http://www.cplusplus.com/reference/clibrary/cstdio/fread.html
http://www.cplusplus.com/reference/clibrary/cstdio/fsetpos.html
http://www.cplusplus.com/reference/clibrary/cstdio/fwrite.html

cumps
 
Obrigado pelas respostas minha gente,

O que eu realmente pretendo é comprimir qualquer tipo de ficheiro usando a codificação huffman.
Como o ficheiro pode ser de qualquer tipo tenho que o ler byte a byte.
A razão pela qual preciso de comparar com uma sequência dada pelo utilizador deve-se ao facto de essa sequência indicar quando devo começar a comprimir o ficheiro ou continuar a deixar o ficheiro como normal.

Por exemplo começo a ler o ficheiro e encontro inicialmente a sequência, logo começo a comprimir o ficheiro, alguns bytes mais à frente leio novamente a sequência e logo paro de comprimir o ficheiro.
O resultado será um ficheiro parcialmente comprimido.
Será que me consegui fazer compreender?
Mais uma vez obrigado pela ajuda.
 
Então como é que distingues se a sequência foi introduzida pelo utilizador ou se faz parte do próprio ficheiro?
Acho que ele quis dizer que a sequência era perguntada ao utilizador do programa durante a execução. Não é preciso distinguir nada.


zbenta, só tens que fazer aquilo que o sportingdan indicou, só que se o utilizador escrever a sequência mesmo em binário (10100101...) terás de converter isto para decimal para poder comparar com os bytes que lês do ficheiro.
 
Back
Topo