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
- Subject: Re: Re: EP3 - não era bem isso que eu queria dizer
- From: Paulo Jose da Silva e Silva <rsilva@ime.usp.br>
- Date: Sat, 26 May 2001 09:40:19 -0300
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