Академический Документы
Профессиональный Документы
Культура Документы
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
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 7
Cap – 8: Ficheiros – Operações básicas
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];
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
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
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 21
Cap – 8: Ficheiros – Operações básicas
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.
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");
UniMETRO/FATEC/LCC-BIF
ProgramaçãoII/ M.T.Ditutala 26