26
1 Tratamento de Ficheiros Tratamento de Ficheiros

1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

Embed Size (px)

Citation preview

Page 1: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

1

Tratamento de FicheirosTratamento de Ficheiros

Page 2: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

2

Tratamento de FicheirosTratamento 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.

Page 3: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

3

Tratamento de FicheirosTratamento de Ficheiros

► A linguagem C é “A linguagem C é “Device IndependentDevice Independent”, ou seja, ”, ou seja, não diferencia os vários periféricos (de entrada ou não diferencia os vários periféricos (de entrada ou saída) ligados ao computador.saída) ligados ao computador.

► Independentemente do tipo de periférico que esteja Independentemente do tipo de periférico que esteja a utilizar, o C processa todas as entradas e saídas a utilizar, o C processa todas as entradas e saídas de dados através de de dados através de streams.streams.

► Stream Stream é um conjunto sequencial de caracteres, é um conjunto sequencial de caracteres, isto é, um conjunto de bytes - ficheiros.isto é, um conjunto de bytes - ficheiros.

Page 4: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

4

Tratamento de FicheirosTratamento 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

Page 5: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

5

Tratamento de FicheirosTratamento de Ficheiros

► Para trabalhar com ficheiros necessita da biblioteca Para trabalhar com ficheiros necessita da biblioteca stdio.hstdio.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

Page 6: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

6

Tratamento de FicheirosTratamento de Ficheiros

► OperaçõesOperações básicas sobre ficheiros: básicas sobre ficheiros: Para trabalhar com um qualquer ficheiro, a Para trabalhar com um qualquer ficheiro, a

primeira operação a realizar é ligar uma variável primeira operação a realizar é ligar uma variável do nosso programa a esse ficheiro. A esta do nosso programa a esse ficheiro. A esta operação dá-se o nome de operação dá-se o nome de Abertura do ficheiroAbertura do ficheiro..

Após a abertura do ficheiro, podemos realizar Após a abertura do ficheiro, podemos realizar operações sobre o conteúdo do ficheiro:operações sobre o conteúdo do ficheiro:►Ler dadosLer dados►Escrever dadosEscrever dados

Após efectuadas as operações pretendidas sobre Após efectuadas as operações pretendidas sobre o ficheiro terá de o ficheiro terá de Fechar o ficheiro.Fechar o ficheiro.

Page 7: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

7

Abertura de um ficheiroAbertura de um ficheiro

► A função que permite a abertura de um ficheiro é a A função que permite a abertura de um ficheiro é a seguinte: seguinte: fopen()fopen(), cuja sintaxe é a seguinte:, 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

Page 8: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

8

Modos de abertura de um Modos de abertura de um ficheiroficheiro

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.

Page 9: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

9

Modos de abertura de um Modos de abertura de um ficheiroficheiro

r+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.

w+

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.

a+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.

Page 10: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

10

Abertura de um ficheiroAbertura 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”);

}

Page 11: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

11

Fecho de um ficheiroFecho de um ficheiro

► Após ter feito as operações sobre um ficheiro, terá de Após ter feito as operações sobre um ficheiro, terá de o fechar. A função que permite o fecho de um ficheiro o fechar. A função que permite o fecho de um ficheiro é a função é a função fclose() fclose() , cuja sintaxe é a seguinte:, 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.

Page 12: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

12

Fecho de um ficheiroFecho 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”);

}

Page 13: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

13

Funções para leitura/escrita num Funções para leitura/escrita num ficheiroficheiro

► 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);

A utilização das funções seguintes exigem que o ficheiro tenha sido previamente aberto no modo mais apropriado.

Page 14: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

14

Funções para leitura/escrita num Funções para leitura/escrita num ficheiroficheiro

► fgets()fgets() Sintaxe: Sintaxe: char *fgets( char *s, int n, FILE *fp ) Exemplo:

char nome[100];…fgets(nome, 100, fp);

► fputs()fputs() Sintaxe: Sintaxe: int fputs( const char *s, FILE *fp ) Exemplo: Exemplo:

char nome[100];strcpy(nome,”olá mundo!”);…fputs(nome, fp);

Escrita/leitura de strings

Page 15: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

15

Funções para leitura/escrita num Funções para leitura/escrita num ficheiroficheiro

► fgetc()fgetc() Sintaxe: Sintaxe: int fgetc ( FILE *fp ) Exemplo:Exemplo:

char letra;char letra;……letra=fgetc(fp);letra=fgetc(fp);

► fputc()fputc() Sintaxe: Sintaxe: int fputc ( int ch, FILE *fp ) Exemplo:Exemplo:

char letra;char letra;……fputc(letra, fp);fputc(letra, fp);

Escrita/leitura de caracteres

Page 16: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

16

Exemplos em CExemplos em C

►grava.cgrava.c► le.cle.c

Page 17: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

17

Tratamento de FicheirosTratamento de Ficheiros

Ficheiros bináriosFicheiros binários

Page 18: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

18

Ficheiros bináriosFicheiros 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.

Page 19: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

19

Ficheiros bináriosFicheiros binários

►Modos de abertura de um ficheiro Modos de abertura de um ficheiro binário:binário: rbrb wbwb abab rb+rb+ wb+wb+ ab+ab+

Page 20: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

20

Abertura de um ficheiro Abertura de um ficheiro binário 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”);

}

Page 21: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

21

Leitura/Escrita de ficheiros Leitura/Escrita de ficheiros bináriosbinários

► As funções vistas até agora (fputs, fgets, fprintf, As funções vistas até agora (fputs, fgets, fprintf, fscanf, …) permitem-nos apenas fazer a leitura e fscanf, …) permitem-nos apenas fazer a leitura e escrita num ficheiro, mas apenas de caracteres, escrita num ficheiro, mas apenas de caracteres, valores numéricos e strings.valores numéricos e strings.

► As duas funções que vamos analisar de seguida, As duas funções que vamos analisar de seguida, permitem-nos ler e escrever um determinado número permitem-nos ler e escrever um determinado número de bytes.de bytes.

► As duas funções são as seguintes:As duas funções são as seguintes: freadfread fwritefwrite

Page 22: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

22

fread – leitura de ficheiros bináriosfread – 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 dadossize – tamanho (em bytes) de cada uma dos elementos a lernum – número de elementos a ler

fp – apontador para o ficheiro de onde vamos ler a informação

Page 23: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

23

fread – leitura de ficheiros fread – leitura de ficheiros bináriosbinários

struct infostruct info{{ int num_aluno;int num_aluno; char nome[100];char nome[100]; int idade;int idade;};};struct info dados;struct info dados;

main()main(){{

……/* abrir o ficheiro em modo de leitura *//* abrir o ficheiro em modo de leitura */……

fread(&dados, sizeof(struct info), 1, fp);fread(&dados, sizeof(struct info), 1, fp);……

}}

Page 24: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

24

fwrite – escrita em ficheiros fwrite – escrita em ficheiros bináriosbiná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.

Page 25: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

25

fwrite – escrita em ficheiros fwrite – escrita em ficheiros bináriosbinários

struct infostruct info

{{

int num_aluno;int num_aluno;

char nome[100];char nome[100];

int idade;int idade;

};};

struct info dados;struct info dados;

main()main()

{{

……

/* abrir o ficheiro em modo de escrita*//* abrir o ficheiro em modo de escrita*/

……

fwrite(&dados, sizeof(struct info), 1, fp);fwrite(&dados, sizeof(struct info), 1, fp);……

}}

Page 26: 1 Tratamento de Ficheiros. 2 Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem

26

Exemplos em CExemplos em C

►grava.cgrava.c► le.cle.c