Lista de discussão de MAC 2301


[Prévia por Data][Próxima por Data]
[Prévia por Assunto][Próxima por Assunto]
[Índice por Data][Índice por Assunto]
[Envie uma nova mensagem para a lista] [Responda esta mensagem]

Re: Re: EP3 - não era bem isso que eu queria dizer



Olá,

Pois é Satai, você está "certo". Até onde sei o mínimo que pode ser escrito 
em um arquivo é um byte e não um bit como você gostaria. Assim, acho que não 
há como escapar de usar rotações e operações bit a bit em cim de "unsigned 
char". Se alguém souber com fazer diferente, por favor digam-me.

Para contornar isso o ideal é vocês escreverem rotinas que leiam e recebam 
bits (algo como fgetbit e fputbit). Elas teriam uma variael local estática 
que faz o papel de buffer até chegar a um byte. Um exemplo da fgetbit em 
seria (olhem nao testei esse código, isto pode estar errado, tô mandano isso 
só para dar uma idéia, nao usem isso antes de entender o que ele deveria 
fazer e corrigirem eventuais erros):

/* Pega um bit do arquivo input                                     */
/* Retorna o proximo bit do arquivo ou EOF caso o fim do arquivo já */
/* tenha chegado.                                                   */
/* Parametros:                                                      */
/*   FILE *entrada: arquivo de onde o bit deve ser lido.            */
/* BUGS: So pode ser usada para ler _um_ arquivo do _inicio_  ate o */
/* _fim_. Para leitura de mais de um arquivo as variaveis posicao   */
/* e byte deveriam ser transformadas parametro da funcao.           */

int fgetbit(FILE *entrada) {
  static posicao = 7;
  static unsigned char byte;
  unsigned char mascara;
  int temp;

  /* Muda a posicao para apontar para o proximo bit que deve ser lido */
  posicao++;
  /* Se tem que ler um novo byte, le. */
  if (posicao >= 8) {
    temp = fgetc(entrada);
    if (temp == EOF) return EOF;
    else {
      byte = (unsigned char) temp;
      posicao = 0;
    }
  }
  /* Pega o bit na posicao certa */
  mascara = 128 >> posicao;
  return byte & mascara;
}

A funcao fputbit seria semelhante só que fazendo o caminho inverso. Espero 
ter sido de ajuda e agora de voltaem a leitura do K&R :-)

Paulo