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
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; } [/sourcecode] 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.

Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s