1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ler ficheiro byte a byte em c

Discussão em 'Programação' iniciada por zbenta, 7 de Janeiro de 2009. (Respostas: 9; Visualizações: 2896)

  1. zbenta

    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.
     
  2. Aparicio

    Aparicio /dev/mod
    Staff Member

  3. Mach4_PT

    Mach4_PT Power Member

    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
     
  4. sportingdan

    sportingdan I'm cool cuz I Fold

    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.
     
  5. Peter V5

    Peter V5 Folding Member

    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:
    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.
     
  6. Aparicio

    Aparicio /dev/mod
    Staff Member

    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.
     
  7. sportingdan

    sportingdan I'm cool cuz I Fold

    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
     
  8. zbenta

    zbenta Power Member

    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.
     
  9. naoliveira

    naoliveira Power Member

    Então como é que distingues se a sequência foi introduzida pelo utilizador ou se faz parte do próprio ficheiro?
     
  10. Aparicio

    Aparicio /dev/mod
    Staff Member

    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.
     

Partilhar esta Página