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