Está prestes a sair a nova versão do Debian … Lenny

De onde vêm estes nomes escolhidos para as várias versões do Debian GNU/Linux?

Encontrei no blog do “Pequeno TUX” um post muito engraçado que conta um pouco da história e mostra as várias personagens do filme ToyStory que servem de “mascote” a cada versão.

Está engraçado: http://pequenotux.blogspot.com/2008/01/de-onde-vem-os-nomes-das-verses-do.html

Este assunto volta a ser pertinente pois aguardamos ansiosamente o lançamento da próxima versão stable do nosso Sistema Operativo preferido.

Ao bom estilo do Software Livre, o Lenny sai quando estiver pronto … e suspeito que seja já este mês :)

Publicado em debian. 1 Comentário »

Manipulação de Ficheiros Binários

Depois de uma abordagem inicial à manipulação de ficheiros de texto, facilmente nos apercebemos de algumas áreas de aplicação desta matéria.

No entanto, o que fica mais evidente é que os ficheiros de texto apenas dão resposta a uma forma de manipulação de informação muito específica, no formato de sequências de caracteres que, na melhor das hipóteses, se encontram separados por caracteres de fim-de-linha.

O acesso a estes ficheiros é feito de forma sequencial, ou seja, torna necessário percorrer o ficheiro à procura da informação pretendida.

Quando os nossos dados não se encontram neste formato, é necessário recorrer ao ficheiros binários, que entre outras vantagens permitem o acesso directo aos dados.

As aplicações que utilizam este tipo de ficheiros geralmente carregam os dados do ficheiro para a memória, realizam o processamento, e voltam a transferir esses mesmos dados para a posição correspondente no ficheiro.

Abertura de ficheiros binários

A abertura é feita de forma semelhante aos ficheiros de texto ( ver aqui ), bastando acrescentar a letra ‘b’ ao modo de abertura.

fp = fopen("dados.txt", "rb");

Operação de escrita num ficheiro binário (fwrite)

A função fwrite transfere um bloco de dados, com um determinado tamanho em bytes, da memória primária para ao ficheiro.

Protótipo: int fwrite(const void *ptr, int tamanho, int n, FILE *fp)

Onde:

  • ptr é um apontador para qualquer tipo de dados e irá conter o endereço de memória do bloco de dados que pretendemos escrever no ficheiro;
  • tamanho em bytes de cada um dos elementos que vamos escrever;
  • n representa o número de elementos a escrever;
  • fp indica(aponta) o ficheiro de dados onde pretendemos realizar a operação de escrita.

Nota: O valor de retorno da função fwrite representa o número de elementos (dos n) que conseguiu escrever com sucesso.

Exemplo: escrita.c

O exemplo seguinte transfere o conteúdo do array valores para um ficheiro cujo nome é passado da linha de comandos.

#include <stdio.h>
int main(int argc, char *argv[]){
    int valores[5]={7, 3, 8, 1, 2};
    FILE *fp;
    if ((fp=fopen(argv[1], "wb"))==NULL || argc != 2){
        printf("ERRO!\nModo de utilização: %s nome_ficheiro_dados\n", argv[0]);
        return 1;
    }
    fwrite(valores, sizeof(int), 5, fp);
    fclose(fp);
    return 0;
}

Nota: É utilizado o operador sizeof(tipo_de_dados) para determinar o número de bytes ocupado por um int. Assim não precisamos de nos preocupar em saber quantos bytes são necessários para armazenar um inteiro numa determinada arquitectura/compilador.

Operação de leitura num ficheiro binário (fread)

A função fread lê um bloco de dados com um determinado tamanho em bytes do ficheiro para a memória primária.

Protótipo: int fread(const void *ptr, int tamanho, int n, FILE *fp)

Onde:

  • ptr é um apontador para qualquer tipo de dados e irá conter o endereço de memória do bloco de dados onde pretendemos escrever os dados obtidos a partir do ficheiro
  • tamanho em bytes de cada um dos elementos que vamos escrever
  • n representa o número de elementos a ler do ficheiro
  • fp indica o ficheiro de dados onde pretendemos realizar a operação de leitura

Nota: O valor de retorno da função fread representa o número de elementos (dos n) que conseguiu ler com sucesso.

Exemplo: ler.c

O exemplo seguinte preenche o conteúdo do array com os valores obtidos a partir de um ficheiro cujo nome é passado da linha de comandos.

#include <stdio.h>
int main(int argc, char *argv[]){
	int valores[5];
	int i;
	FILE *fp;
	if ((fp=fopen(argv[1], "rb"))==NULL || argc != 2){
		printf("ERRO!\nModo de utilização: %s nome_ficheiro_dados\n", argv[0]);
		return 1;
	}
	fread(valores, sizeof(int), 5, fp);
	fclose(fp);
	for(i=0; i<5; i++)
		printf("valores[%d] = %d\n", i, valores[i]);
	return 0;
}

Muito fica ainda por dizer a este respeito, mas em termos do trabalho que estou a realizar actualmente vou ficar apenas por este aspecto, ou seja, a transferência de blocos de bytes entre a memória e o ficheiro.

Depois existem formas de se fazer o acesso directo ao ficheiro mas esse aspecto fica para outra altura.