Você está na página 1de 24

INTRODUO

PROGRAMAO EM
LINGUAGEM C


linguagem C
Formas Complexas
Ficheiros Binrios




Ficheiro binrio
Os arquivos binrios correspondem a arquivos
de dados, executveis, jogos, etc.
Basicamente, para ler os dados destes arquivos
necessrio utilizar operaes denominadas
de acesso directo, onde os dados so escritos
em blocos de memria para o disco e lidos em
blocos do disco para a memria.
Assim, possvel escrever um vector inteiro em
disco de uma s vez, enquanto usando
arquivo texto seria necessrio escrever
elemento por elemento.




Escrita de blocos em ficheiros
Binrios

fwrite -> funo responsvel por escrever um
bloco de Bytes existentes em memria para
um ficheiro aberto em modo binrio.
Sintaxe:
int fwrite(const void *ptr, int size, int n, FILE
*fich)


Escrita de blocos em ficheiros
Binrios
ptr -> um apontador para void (isto , pode ser
um apontador para qualquer tipo) e contm o
endereo de memria daquilo que
pretendemos guardar em ficheiro.
const->indica que o parmetro (ou que ele
aponta) no ir ser alterado.
size-> Indica o tamanho em Bytes (a dimenso
de um elemento pode ser obtida atravs do
operador sizeof) de cada um dos elementos
que pretendemos escrever.

Escrita de blocos em ficheiros
Binrios
n -> Indica o n. de elementos que queremos
escrever.
fich -> Descritor, indicando o ficheiro onde os
dados iro ser colocados. Este argumento a
varivel que recebeu o resultado da funo
fopen.
Retorna: o nmero de itens que se conseguiram
escrever com sucesso 0 (zero).

Exemplo

#include <stdio.h>
#include <stdlib.h> /* Por causa da funo exit */
main()
{
FILE *fp;
int i, v[10];
/* Ler os Dados a partir do Teclado */
for (i=0; i<10; i++)
{
printf("Introd. o %d-esimo N: ",i+1);
scanf("%d",&v[i]);
}
Exemplo

/* Abrir o Ficheiro DADOS.DAT */
if ((fp = fopen("DADOS.DAT","wb"))==NULL)
{ printf("Impossvel Criar o ficheiro %s\n","DADOS.DAT");
exit(1);
}
if (fwrite(v,sizeof(int),10,fp)!=10)
fprintf(stderr, "No foram escritos todos os
elementos!!!\n");
fclose(fp);
}



Leitura de blocos de ficheiros
binrios

fread -> Funo responsvel pela leitura para a
memria de um bloco de bytes existente num
ficheiro aberto em modo binrio.

Sintaxe:
int fread(const void *ptr, int size, int n,
FILE *fich)


Leitura de blocos de ficheiros
binrios

ptr -> um apontador para void (isto , pode
ser um apontador para qualquer tipo) e
contm o endereo de memria onde
queremos colocar os dados que iremos ler a
partir do ficheiro.
Size -> Indica o tamanho em Bytes de cada um
dos elementos que pretendemos ler.

Leitura de blocos de ficheiros
binrios
n -> Indica o nmero de elementos que
queremos ler.
fich ->Descritor, indicando o ficheiro de onde
os dados iro ser lidos. Este argumento
corresponde varivel que recebeu o
resultado da funo fopen.
Retorna: O nmero de itens que se
conseguiram ler com sucesso.


Exemplo

Escreva um programa que carregue um vector
com 10 inteiros lidos a partir do ficheiro
Dados.dat escritos em disco pelo programa
anterior. Depois de ler os 10 inteiros dever
mostr-los no ecr.


Resoluo 1

#include <stdio.h>
#include <stdlib.h> /* Por causa da funo exit */
main()
{
FILE *fp;
int i, v[10],n;
/* Abrir o Ficheiro DADOS.DAT */
if ((fp = fopen("DADOS.DAT","rb"))==NULL)
{ printf("Impossvel Abrir o ficheiro %s\n","DADOS.DAT");
exit(1);
}
n = fread(v,sizeof(int),10,fp);
if (n!=10)
fprintf(stderr, "Foram lidos apenas %d Elementos!!!\n",n);
/* Apresentar os dados ao utilizador */
for (i=0; i<n; i++)
printf("%2d N: %d\n",i+1,v[i]);
fclose(fp);
}


Deteco do final do ficheiro
(EOF)

feof -> funo que realiza a deteco de End-
Of-
File (EOF).
Sintaxe:
int feof(FILE *fich)
Esta funo devolve um valor lgico, indicando se
o
argumento passado funo est ou no numa
situao de EOF.


Exemplo

Verifique o seguinte exemplo que cria um
ficheiro vazio, o volta a abrir e faz em
seguida a deteco de End-Of-File.

Resoluo

#include <stdio.h>
#include <stdlib.h> /* Por causa da funo exit */
main()
{
FILE *fp;
int i=0, valor,n;
/* Criar o Ficheiro LIXO vazio*/
if ((fp = fopen("LIXO","wb"))==NULL)
{ printf("Impossvel Criar o ficheiro %s\n","LIXO");
exit(1);
}
fclose(fp);

Resoluo

/* Abrir o Ficheiro */
if ((fp = fopen("LIXO","rb"))==NULL)
{ printf("Impossvel Abrir o ficheiro %s\n","LIXO");
exit(1);
}
puts(feof(fp)? "EOF" : "NOT EOF");
/* Tentar ler um carcter */
fgetc(fp);
puts(feof(fp)? "EOF" : "NOT EOF");
fclose(fp);
}


Acesso sequencial e Acesso
Directo a Ficheiros

Acesso Sequencial -> Percorre-se o ficheiro
at localizarmos aquilo que pretendemos.

Acesso Directo -> Colocando-nos na posio
que queremos de um ficheiro, sem ter que
percorrer todos os Bytes que se encontram
antes dessa posio.

Exemplo

Escreva um programa que abra um ficheiro e
indique quantos Bytes este contm, obtendo
este valor atravs de Aceso Sequencial.

Resoluo

#include <stdio.h>
#include <stdlib.h> /* Por causa da funo exit */
main(int argc, char*argv[])
{
FILE *fp;
long int nBytes=0;
if (argc!=2)
{printf("Sintaxe:\n\n%s ficheiro\n\n",argv[0]);
exit(1);
}
if ((fp = fopen(argv[1],"rb"))==NULL) /* Binario */
{ printf("Impossvel Abrir o ficheiro %s\n",argv[1]);
exit(2);
}

Resoluo

/* Acesso Sequencial Byte a Byte */
while (fgetc(fp)!=EOF) /* Ler um char */
nBytes++;
fclose(fp);
printf("Dim. do Ficheiro: %ld\n",nBytes);
}


Posicionamento ao longo do
ficheiro

rewind -> Funo que permite colocar o
apontador a apontar para o inicio do ficheiro,
independentemente da posio onde nos
encontremos.

Sintaxe:
void rewind(FILE *fich)

Modos de abertura

Bibliografia
Bases de programao, Artur
Augusto Azul, 10 ano
ISBN: 978-072-0-43433-3