Вы находитесь на странице: 1из 26

Programação II

Acetatos das Aulas Teóricas - 2010


Cap – 8: Ficheiros
 Definição:
 Um ficheiro é um dispositivo de memória usado para armazenar
dados de modo permanente.
 Pode ser entendido como sendo um dispositivo lógico que
armazena uma sequência (stream) de bytes na memória física (HD,
Flush, CD-ROM, etc).
 Em geral usa-se um caracter especial para indicar o final do ficheiro
(EOF – End of File)
 O acesso aos dados de um ficheiro é efectuado mediante um
stream (descritor, apontador, ponteiro ou canal).
 Uma stream é o fluxo de dados de um programa para um
dispositivo como um arquivo físico ou outros dispositivos de E/S:
monitor de vídeo e teclado.
 Neste processo, existe uma área da memória que é usada
temporariamente para armazenar os dados, antes de enviar os
mesmos para o seu destino, chamada de buffer.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 2
Cap – 8: Ficheiros – Conceitos
 Portanto a cada ficheiro aberto estará
associado um stream
 Três ficheiros são automaticamente
abertos quando um programa é iniciado:
 standard input,
 standard output
 standard error

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 3
Cap – 8: Ficheiros – Operações básicas
 Sobre os ficheiros são efectuadas quatro
operações básicas, na seguinte sequência:
◦ Abertura
◦ Leitura
◦ Escrita
◦ Fecho
 Podendo as operações de leitura e escrita
serem feitas simultaneamente sobre o
mesmo ficheiro
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 4
Cap – 8: Ficheiros – Operações básicas
 A abertura de um ficheito devolve um
apontador para uma estrutura FILE.
 Para os ficheiros standard, acima indicados,
os apontadores são:
 stdin – para o standard input (teclado)
 stdout – para o standard output (Ecran)
 stderr – para o standard error (Ecran)

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 5
Cap – 8: Ficheiros – Operações básicas

 Abertura de Ficheiros
◦ A sintaxe da função de abertura de ficheiros
num programa em C é:
 FILE *fopen(char nome_do_ficheiro[], char modo[]);
◦ Em caso de sucesso ela devolve um apontador
para um FILE, que passa a ser utilizado em
todos os acessos ao ficheiro
◦ Em caso de insucesso ela devolve NULL.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 6
Cap – 8: Ficheiros – Operações básicas

 Abertura de Ficheiros de texto


◦ Os modos de abertura podem ser:
 “r” – abertura para leitura. Caso o ficheiro não
exista a função devolve NULL.
 “w” – abertura para escrita. caso o ficheiro não
exista é criado um novo. Caso exista o conteúdo
inicial é apagado!
 “a” – abertura para escrita. Caso o ficheiro não
exista é criado um novo. Caso exista escreve-se a
partir do fim do ficheiro.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 7
Cap – 8: Ficheiros – Operações básicas

 Abertura de Ficheiros de texto


 “r+” – abertura para leitura e escrita. Caso o
ficheiro não exista a função devolve NULL.
 “w+” – abertura para escrita e leitura. caso o
ficheiro não exista é criado um novo. Caso exista o
conteúdo inicial é apagado!
 “a+” – abertura para escrita. Caso o ficheiro não
exista é criado um novo. Caso exista escreve-se a
partir do fim do ficheiro.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 8
Cap – 8: Ficheiros – Operações básicas
 Fecho de um Ficheiros
 A função de fecho de um ficheiro tem a
seguinte sintaxe:
 int fclose(FILE *fp);
 Sendo que:
◦ fp: é o descritor do ficheiro que se pretende
fechar
 Em caso de sucesso a função devolve
zero(0)
 E em caso de erro a função devolve EOF.
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 9
Cap – 8: Ficheiros – Operações básicas
 Abertura e Fecho de Ficheiros de texto
#include <stdio.h>

main(){
FILE *f;
char s[20];

puts(“Escreva nome do f icheiro:”);


gets(s);

f = fopen(s,“r”);
if (f==NULL)
printf(“ERRO na abertura do f icheiro %s\n”,s);
else {
printf(“SUCESSO na abertura do f icheiro %s\n”,s);
fclose(f );
}
}

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 10
Cap – 8: Ficheiros – Operações básicas
 Leitura e Escrita sobre Ficheiros de Texto
◦ Um ficheiro de texto é um ficheiro de caracteres.
◦ Um ficheiro de texto é um ficheiro binário em
que cada carácter ocupa um (1) byte.
◦ Ficheiros de texto são ficheiros cujo acesso, tanto
para leitura como para escrita é feito de modo
sequencial.
◦ Neste caso, destacam-se duas formas básicas de
leitura/escrita, que são:
 Leitura/escrita caracter por caracter
 Leitura/escrita linha por linha

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 11
Cap – 8: Ficheiros – Operações básicas
 Leitura caracter por caracter
◦ Para este fim usam-se as funções:
◦ int fgetc(FILE *fp);
 Em que:
◦ fp: é o descritor ou ponteiro ou variável que
contém o endereço do ficheiro lógico.
 Retorno (normalmente ignorado):
◦ Um inteiro (int) correspondente ao carácter lido;
◦ Em caso de erro ou ficheiro vazio a função
retorna EOF
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 12
Cap – 8: Ficheiros – Operações básicas
 Escrita caracter por caracter
◦ Para este fim usam-se as funções:
◦ int fputc(FILE *fp);
 Em que:
◦ fp: é o descritor ou ponteiro ou variável que
contém o endereço do ficheiro lógico.
 Retorno (normalmente ignorado):
◦ Um inteiro (int) correspondente ao carácter
escrito;
◦ Em caso de erro a função retorna EOF
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 13
Cap – 8: Ficheiros – Operações básicas
 Leitura Formatada
◦ Para este fim usam-se as funções:
◦ int fscanf(FILE *fp,”formatos”,argumentos);
 Em que:
◦ fp: é o descritor ou ponteiro ou variável que contém o
endereço do ficheiro lógico.
◦ formatos - é relativo aos dados a serem lidos (%d, %f, %c,
%s)
◦ argumentos – lista de variáveis cujo conteúdo será
manipulado pelos formatos.
 Retorno (normalmente ignorado):
◦ Um inteiro (int) correspondente aos caracteres lidos;
◦ Em caso de erro ou ficheiro vazio a função retorna EOF

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 14
Cap – 8: Ficheiros – Operações básicas
 Escrita Formatada
◦ Para este fim usam-se as funções:
◦ int fprintf(FILE *fp,”formatos”,argumentos);
 Em que:
◦ fp: é o descritor ou ponteiro ou variável que contém o
endereço do ficheiro lógico.
◦ formatos - é relativo aos dados a serem escritos (%d, %f,
%c, %s)
◦ argumentos – lista de variáveis (separados por ‘,’) cujo
conteúdo será manipulado pelos formatos.
 Retorno (normalmente ignorado):
◦ Um inteiro (int) correspondente aos caracteres escritos;
◦ Em caso de erro ou ficheiro vazio a função retorna EOF

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 15
Cap – 8: Ficheiros – Operações básicas
 Exemplo de Leitura e Escrita Formatada
◦ Lê dum ficheiro (price.dat) de preços e escreve noutro ficheiro
(tax.dat) de preços com imposto de 5%
#include <stdio.h> // abre ficheiro destino
#include <stlib.h> // por causa da função exit fout=fopen(“tax.dat”,“w”);
#def ine TAX 0.05 if (fout==NULL)
{
main()
printf(“nao pode escrever em tax.dat!\n”);
{ exit(1);
FILE *f in, *fout; }
float price; // lê de price.dat, calcula, e escreve em tax.dat
// abre f icheiro origem while (fscanf(fin, “%f ”,&price) == 1)
f in=fopen(“price.dat”,“r”); {
if (f in==NULL) fprintf(fout, “%7.2f ”, price * (1 + TAX));
{ }
if (!feof(fin))
printf(“price.dat inexistente!\n”);
printf(“Erro na leitura de ficheiro origem”);
exit(1); fclose(fin);
} fclose(fout);
}
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 16
Cap – 8: Ficheiros – Operações básicas
 Leitura de uma Linha
 Neste caso usa-se a função fgets(), cujo sintaxe
é:
◦ char * fgets(char buffer[TAM],TAM, FILE *fp);
◦ fgets() – Lê de fp TAM-1 caracteres e os armazena
na variável buffer
◦ Lê incluindo o caracter ‘\n’. No final da string, a
função coloca o ‘\0’

 Retorno:
◦ A string lida ou
◦ NULL em caso de erro ou fim de ficheiro
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 17
Cap – 8: Ficheiros – Operações básicas

 Escrita de uma Linha


 Neste caso usa-se a função fputs(), cujo
sintaxe é:
◦ int fputs(char buffer[TAM], FILE *fp);
◦ fputs() – escreve para fp o conteúdo de buffer
 Retorno:
◦ Um inteiro positivo (>0) em caso de sucesso.
◦ EOF em caso de erro

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 18
Cap – 8: Ficheiros – Operações básicas
 Leitura e Escrita sobre Ficheiros Binários
 Um ficheiro binário é um ficheiro que armazena dados na
forma binária, exactamente como são armazenados na
memória dum computador.
 Isto quer dizer que um int é representado num ficheiro
binário tal como é guardado na memória (em formato
máquina)
 Para ler os dados destes ficheiros é necessário utilizar
operações denominadas de acesso directo, onde os dados
são escritos em blocos de memória para o disco e lidos em
blocos do disco para a memória.
 Por exemplo, é possível ler ou escrever um vector inteiro em
disco de uma só vez, enquanto que usando ficheiros de texto
seria necessário escrever elemento por elemento.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 19
Cap – 8: Ficheiros – Operações básicas
 Abrir um ficheiro de binário.
◦ A abertura de um ficheiro binário é realizada recorrendo
igualmente à função fopen().
 Há 3 modos de abertura dum ficheiro de binário:
◦ “rb”: read — abertura de ficheiro para leitura
 – se ficheiro existe, coloca marcador no início
 – se ficheiro não existe, retorna erro
◦ “wb”: write — abertura de ficheiro para escrita
 – se ficheiro existe, esvazia ficheiro (coloca marcador no início)
 – se ficheiro não existe, então cria-o (coloca marcador no início)
◦ “ab”: append — abertura de ficheiro para escrita no fim
 – se ficheiro existe, coloca marcador no fim
 – se ficheiro não existe, então cria-o (coloca marcador no início=fim)
 Para leitura e escrita simultânea acrescenta-se ‘+’
após cada letra dos modos acima

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 20
Cap – 8: Ficheiros – Operações básicas

 Leitura de um ficheiro de binário.


◦ size_t fread(void *buff, size_t size, size_t nobj, FILE *fp);
 fread lê de fp e armazena o conteúdo lido no
buff. No máximo nobj objectos do tamanho size
serão lidos.
 retorna o numero de objectos lidos; que pode
ser inferior do que o solicitado
 Recomenda-se o uso de feof e ferror para
testar o estado.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 21
Cap – 8: Ficheiros – Operações básicas

 Escrita num ficheiro binário.


◦ size_t fwrite(void *buff, size_t size, size_t nobj, FILE *fp);
 fwrite escreve para fp o conteúdo de buff. No
máximo nobj objectos do tamanho size serão
escritos.
 Retorna o numero de objectos escritos; que
pode ser inferior do que o solicitado em caso
de erro.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 22
Cap – 8: Ficheiros – Operações básicas
 Exemplo de Leitura e Escrita num ficheiro binário.

typedef struct { (...)


char cidade[50]; registo ficha;
int temperatura; FILE *fh;
} registo;
fh = fopen("temperaturas.dat", "rb");

fh = fopen("temperaturas.dat", "ab"); fread(&ficha,


fread sizeof(registo), 1, fh);

printf("Insira
printf o nome da cidade: "); printf("cidade
printf %s temperatura %hd
gets(ficha.cidade);
gets graus.\n", ficha.cidade,
ficha.temperatura);
printf("Insira
printf a temperatura da cidade: ");
scanf("%d",
scanf &ficha.temperatura);

fwrite(&ficha,
fwrite sizeof(registo), 1, fh);
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 23
Cap – 8: Ficheiros – Operações básicas
 Outras Funções de Manipulação de Ficheiros
 feof()
◦ Seu protótipo é:
◦ int feof (FILE *fp);
◦ É usada para verificar o final do ficheiro
◦ Ela retorna um inteiro diferente de zero (0) se o ficheiro chegou ao EOF,
caso contrário retorna zero(0).
 ferror()
◦ Seu protótipo é:
 int ferror (FILE *fp);
◦ Torna-se muito útil quando se quer verificar se cada acesso a um ficheiro
teve sucesso
◦ Por exemplo, pode acabar o espaço em disco enquanto se grava, ou o disco
pode estar com problemas e não se consegue ler
◦ Retorna zero (0), se nenhum erro ocorreu e um número diferente de zero
se algum erro ocorreu

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 24
Cap – 8: Ficheiros – Operações básicas
 Outras Funções de Manipulação de Ficheiros
 perror() - print error
◦ Seu protótipo é:
◦ void perror(const char *s);
◦ Imprime uma mensagem de erro.
 fseek()
◦ Seu protótipo é:
◦ int fseek (FILE *fp,long numbytes,int origem);
◦ Usada para fazer acesso aleatório ao ficheiro
◦ Move a posição corrente de leitura ou escrita no ficheiro de
numbytes, a partir de um ponto especificado pela origem.
◦ Os valores possíveis de origem são:
 SEEK_SET se for a partir do início do ficheiro;
 SEEK_CUR se for a partir da posição actual do cursor;
 SEEK_END se for a partir do final do ficheiro.

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 25
Cap – 8: Ficheiros – Operações básicas
 Outras Funções de Manipulação de Ficheiros
 Exemplo:
#include <stdio.h>
main()
{
FILE *fp;
fp= fopen("c:\\teste.TXT", "r+");
fprintf(fp, "Isto ‚ um teste");
if(ferror(fp))
{
perror("Erro na gravacao");

// posiciona-se no segundo caracter do ficheiro a partir do início.


fseek(fp, 2, SEEK_SET);
printf ("\n%c",fgetc(fp)); // escreve o caracter “t" no ecrã.
fclose(fp);
}

UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 26

Вам также может понравиться