Tratamento de Ficheiros
1
Tratamento de Ficheiros
►
Até ao momento, todos os dados têm sido inseridos nos
programas através do teclado, sendo guardados em
variáveis que residem em memória central (R.A.M.)
►
Este tipo de memória apresenta no entanto os
inconvenientes de ser volátil, pelo que impossibilita o
armazenamento de dados após a execução de um
programa
►
Para armazenamentos mais demorados é utilizada, a
memória secundária ( i.e. o disco rígido, a disquete, …),
em que a informação é armazenada sob a forma de
ficheiros.
2
Tratamento de Ficheiros
►
A linguagem C é “Device Independent”, ou seja, não
diferencia os vários periféricos (de entrada ou saída)
ligados ao computador.
►
Independentemente do tipo de periférico que esteja a
utilizar, o C processa todas as entradas e saídas de dados
através de streams.
►
Stream é um conjunto sequencial de caracteres, isto é, um
conjunto de bytes - ficheiros.
3
Tratamento de Ficheiros
►
Por defeito, um programa ao executar tem 5 ficheiros
automaticamente abertos :





stdin - standard input (teclado)
stout - standard output (monitor)
stderr - standard error (monitor ou outro)
stdaux - aux device (porta COM1 num PC)
stdprn - standard printer
4
Tratamento de Ficheiros
►
Para trabalhar com ficheiros necessita da biblioteca stdio.h
►
A linguagem C suporta dois tipos de ficheiros :
 Ficheiro de Texto – é um ficheiro constituído apenas pelos
caracteres existentes no nosso teclado, e em geral formatado
apenas com o carácter New Line (\n)
 Ficheiro Binário – podem ser constituídos por qualquer carácter
existente na tabela ascci
5
Tratamento de Ficheiros
►
Operações
básicas sobre ficheiros:
 Para trabalhar com um qualquer ficheiro, a primeira
operação a realizar é ligar uma variável do nosso
programa a esse ficheiro. A esta operação dá-se o nome
de Abertura do ficheiro.
 Após a abertura do ficheiro, podemos realizar operações
sobre o conteúdo do ficheiro:
► Ler
dados
► Escrever dados
 Após efectuadas as operações pretendidas sobre o
ficheiro terá de Fechar o ficheiro.
6
Abertura de um ficheiro
►
A função que permite a abertura de um ficheiro é a
seguinte: fopen(), cuja sintaxe é a seguinte:
 FILE *fopen(char *nome_do_ficheiro, char *modo_de_abertura)
►
A função devolve:
 um apontador para um FILE, que passa a ser utilizado em todos os
acessos ao ficheiro (isto se conseguir abrir o ficheiro);
 NULL se ocorrer um erro na abertura;
►
A função recebe dois parâmetros:
 nome_do_ficheiro – nome do ficheiro a abrir
 modo_de_abertura – modo de abertura do ficheiro
7
Modos de abertura de um ficheiro
r
(read)
Abre o ficheiro para leitura.
Caso não seja possível abrir o ficheiro, a função devolve NULL.
w
(write)
Abre o ficheiro para escrita.
Se o ficheiro não existir, é criado com o nome passado à função.
Se o ficheiro já existir, é apagado e criado um novo com o mesmo nome.
Caso não seja possível criar o ficheiro, a função devolve NULL.
a
(append)
Abre o ficheiro para acrescento , no fim do ficheiro.
Se o ficheiro existir, os novos dados são escritos no fim do ficheiro.
Se o ficheiro não existir, é criado.
8
Modos de abertura de um ficheiro
r+
w+
a+
Abre o ficheiro para leitura e escrita.
Se o ficheiro não existir, é criado.
Se o ficheiro existir, os novos dados são escritos a partir do início do
ficheiro, sobre os que já lá existem.
Abre o ficheiro para leitura e escrita.
Se o ficheiro não existir, é criado.
Se o ficheiro já existir, é apagado e criado um novo com o mesmo
nome.
Abre o ficheiro para leitura e escrita.
Se o ficheiro não existir, é criado.
Se o ficheiro já existir, os novos dados são colocados a partir do fim do
ficheiro.
9
Abertura de um ficheiro
#include <stdio.h>
#include <stdlib.h>
main( )
{
}
FILE *fp;
fp = fopen (“oMeuFicheiro.txt”, “r”);
if (fp==NULL)
{
printf (“ERRO – não foi possível abrir o ficheiro !”);
system(“pause”);
exit(1);
}
else
{
printf (“Abertura com sucesso !”);
}
…
…
system(“pause”);
10
Fecho de um ficheiro
►
Após ter feito as operações sobre um ficheiro, terá de o
fechar. A função que permite o fecho de um ficheiro é a
função fclose() , cuja sintaxe é a seguinte:
 int fclose (FILE *fp)
►
Esta função fecha o ficheiro apontado por fp
►
Em caso de erro (i.e. fechar um ficheiro que ainda não foi aberto)
retorna EOF, se fechou o ficheiro com sucesso retorna zero.
Normalmente não se verifica o valor devolvido por esta função.
11
Fecho de um ficheiro
#include <stdio.h>
#include <stdlib.h>
main( )
{
FILE *fp;
fp = fopen (“oMeuFicheiro.txt”, “r”);
if (fp==NULL)
{
printf (“ERRO – não foi possível abrir o ficheiro !”);
system(“pause”);
exit(1);
}
else
{
printf (“Abertura com sucesso !”);
}
fclose(fp);
}
system(“pause”);
12
Funções para leitura/escrita num ficheiro
A utilização das funções seguintes exigem que o ficheiro tenha sido
previamente aberto no modo mais apropriado.
►
fscanf()
 Sintaxe: int fscanf (FILE *fp, const char, *format,...)
 Exemplo:
char letra;
…
fscanf (fp, “%c”, &letra);
►
fprintf()
 Sintaxe: int fprintf (FILE *fp, const char, *format,...)
 Exemplo:
char letra;
letra=‘a’;
…
fprintf (fp, “%c”, letra);
13
Funções para leitura/escrita num ficheiro
Escrita/leitura de strings
►
fgets()
 Sintaxe: char *fgets( char *s, int n, FILE *fp )
 Exemplo:
char nome[100];
…
fgets(nome, 100, fp);
►
fputs()
 Sintaxe: int fputs( const char *s, FILE *fp )
 Exemplo:
char nome[100];
strcpy(nome,”olá mundo!”);
…
fputs(nome, fp);
14
Funções para leitura/escrita num ficheiro
Escrita/leitura de caracteres
►
fgetc()
 Sintaxe: int fgetc ( FILE *fp )
 Exemplo:
char letra;
…
letra=fgetc(fp);
►
fputc()
 Sintaxe: int fputc ( int ch, FILE *fp )
 Exemplo:
char letra;
…
fputc(letra, fp);
15
Exemplos em C
► grava.c
► le.c
16
Tratamento de Ficheiros
Ficheiros binários
17
Ficheiros binários
►
Podem ser constituídos por qualquer carácter existente na tabela ascci;
►
Os dados não se encontram organizados em linhas;
►
Executáveis e imagens são exemplos de ficheiros binários;
►
O acesso a este tipo de ficheiros designa-se por acesso directo;
►
As funções que permitem realizar a leitura e escrita, através de aceso
directo são:
 fread
 fwrite
►
Para abrir um ficheiro em modo binário é necessário acrescentar um b
ao modo de abertura, pois por defeito o ficheiro é aberto em modo de
texto.
18
Ficheiros binários
► Modos






de abertura de um ficheiro binário:
rb
wb
ab
rb+
wb+
ab+
19
Abertura de um ficheiro binário
#include <stdio.h>
#include <stdlib.h>
main( )
{
}
FILE *fp;
fp = fopen (“oMeuFicheiro.dat”, “rb”);
if (fp==NULL)
{
printf (“ERRO – não foi possível abrir o ficheiro binário !”);
system(“pause”);
exit(1);
}
else
{
printf (“Abertura com sucesso !”);
}
…
…
system(“pause”);
20
Leitura/Escrita de ficheiros binários
►
As funções vistas até agora (fputs, fgets, fprintf, fscanf, …)
permitem-nos apenas fazer a leitura e escrita num ficheiro,
mas apenas de caracteres, valores numéricos e strings.
►
As duas funções que vamos analisar de seguida, permitemnos ler e escrever um determinado número de bytes.
►
As duas funções são as seguintes:
 fread
 fwrite
21
fread – leitura de ficheiros binários
A função que permite a leitura é a seguinte:
int fread ( const void *ptr, int size, int num, FILE *fp)
Onde:
ptr – endereço em memória onde se pretende colocar os dados
size – tamanho (em bytes) de cada uma dos elementos a ler
num – número de elementos a ler
fp – apontador para o ficheiro de onde vamos ler a informação
22
fread – leitura de ficheiros binários
struct info
{
int num_aluno;
char nome[100];
int idade;
};
struct info dados;
main()
{
…
/* abrir o ficheiro em modo de leitura */
…
fread(&dados, sizeof(struct info), 1, fp);
…
}
23
fwrite – escrita em ficheiros binários
A função que permite a leitura é a seguinte:
int fwrite (const void *ptr, unsigned size, int num, FILE *fp)
Onde:
ptr – endereço em memória de onde estão os dados a escrever;
size – tamanho (em bytes) de cada uma dos elementos a escrever;
num – número de elementos a escrever;
fp – apontador para o ficheiro onde vamos escrever a informação.
24
fwrite – escrita em ficheiros binários
struct info
{
int num_aluno;
char nome[100];
int idade;
};
struct info dados;
main()
{
…
/* abrir o ficheiro em modo de escrita*/
…
fwrite(&dados, sizeof(struct info), 1, fp);
…
}
25
Exemplos em C
► grava.c
► le.c
26
Download

Ficheiros