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.
