Os arquivos binários têm duas características que os distinguem de arquivos de texto:
A linguagem C suporta o conceito de arquivo de estruturas de forma básica. Ao abrir o arquivo, você pode ler uma estrutura, escrever uma estrutura ou pesquisar qualquer estrutura no arquivo. Este conceito de arquivo suporta o conceito de um ponteiro de arquivo. Quando ele é aberto, o ponteiro aponta para o registro 0 (o primeiro registro no arquivo). Qualquer operação de leitura lê a estrutura apontada e move o ponteiro um nível abaixo na estrutura. Qualquer operação de escrita grava na estrutura apontada e move o ponteiro um nível abaixo na estrutura. Seek move o ponteiro para o registro solicitado.
Lembre-se de que a linguagem C considera tudo no arquivo de disco como blocos de bytes lidos do disco na memória ou lidos da memória para o disco. A linguagem C usa um ponteiro de arquivo, mas pode apontar para qualquer byte no arquivo.
O programa abaixo ilustra estes conceitos:
#include <stdio.h>
/* descrição de registro aleatório - pode ser qualquer uma */
struct rec
{
int x,y,z;
};
/* grava e depois lê 10 registros arbitrários
do arquivo "junk". */
int main()
{
int i,j;
FILE *f;
struct rec r;
/* cria o arquivo de 10 registros */
f=fopen("junk","w");
if (!f)
return 1;
for (i=1;i<=10; i++)
{
r.x=i;
fwrite(&r,sizeof(struct rec),1,f);
}
fclose(f);
/* lê os 10 registros */
f=fopen("junk","w");
if (!f)
return 1;
for (i=1;i<=10; i++)
{
fread(&r,sizeof(struct rec),1,f);
printf("%d\n",r.x);
}
fclose(f);
printf("\n");
/* usa fseek para ler os 10 registros
em ordem inversa */
f=fopen("junk","w");
if (!f)
return 1;
for (i=9; i>=0; i--)
{
fseek(f,sizeof(struct rec)*i,SEEK_SET);
fread(&r,sizeof(struct rec),1,f);
printf("%d\n",r.x);
}
fclose(f);
printf("\n");
/* usa fseek para ler todo os outros registros */
f=fopen("junk","r");
if (!f)
return 1;
fseek(f,0,SEEK_SET);
for (i=0;i<5; i++)
{
fread(&r,sizeof(struct rec),1,f);
printf("%d\n",r.x);
fseek(f,sizeof(struct rec),SEEK_CUR);
}
fclose(f);
printf("\n");
/* usa fseek para ler o 4º registro,
altere-o e escreva-o de volta */
f=fopen("junk","r+");
if (!f)
return 1;
fseek(f,sizeof(struct rec)*3,SEEK_SET);
fread(&r,sizeof(struct rec),1,f);
r.x=100;
fseek(f,sizeof(struct rec)*3,SEEK_SET);
fwrite(&r,sizeof(struct rec),1,f);
fclose(f);
printf("\n");
/* lê os 10 registros para garantir
que o 4º arquivo foi alterado */
f=fopen("junk","r");
if (!f)
return 1;
for (i=1;i<=10; i++)
{
fread(&r,sizeof(struct rec),1,f);
printf("%d\n",r.x);
}
fclose(f);
return 0;
}
Neste programa, uma descrição de estrutura rec foi usada, mas você pode usar a descrição de estrutura que quiser. Você também pode ver que fopen e fclose trabalham exatamente da mesma forma que nos arquivos de texto.
As novas funções aqui são fread, fwrite e fseek. A função fread captura quatro parâmetros:
A função fwrite opera da mesma forma, mas move o bloco de bytes da memória para o arquivo. A função fseek move o ponteiro de arquivo para um byte no arquivo. Em geral, você muda o ponteiro em incrementos de sizeof(struct rec) para manter o ponteiro nos limites do registro. Você pode usar três opções ao pesquisar:
Várias opções diferentes aparecem no código acima. Observe em particular a seção na qual o arquivo é aberto com o modo r+. Isto abre o arquivo para leitura e gravação, permitindo que os registros sejam alterados. O código busca um registro, lê e altera um campo. Depois busca novamente, pois a leitura deslocou o ponteiro, e grava de volta a alteração.
Para mais informações sobre a linguagem C e tópicos relacionados, verifique os links na próxima página.
| FAVORITOS | |||||
| Faça do HowStuffWorks a sua página inicial | | | digg it! (?) | | | del.icio.us | |