Baixe o app para aproveitar ainda mais
Prévia do material em texto
Módulo 7 Tratamento de Ficheiros PSI 1º ano 2018/2019 TGPSI - Paulo Reis - Agrupamento de Escolas da Batalha 2 Tratamento de Ficheiros - Parte 1- 3 Ficheiros Conceitos gerais 4 Modelo de um Computador Armazenamento secundário CPU Central de Processamento Memória Dispositivos de entrada/saída Canal de comunicação (BUS) 5 Motivação Os ficheiros são utilizados para guardar dados depois de o programa que os gerou ter terminado; O motivo pelo qual se torna fundamental a utilização de ficheiros resulta da necessidade de perpetuar os dados para além do ciclo de vida de um programa. Os dados armazenados nas variáveis criadas pela execução do programa, residentes na memória principal, que apenas se encontram disponíveis enquanto o programa está em execução. a utilização de ficheiros, armazenados em suportes secundários, não fica dependente do programa estar em execução. 6 Características Podem armazenar grande quantidade de informação; Dados são persistentes (ex: gravados em disco); Acesso aos dados pode ser não sequencial (ex: acesso direto a registos numa base de dados); Acesso à informação pode ser concorrente (ex: mais de um programa ao mesmo tempo). 7 Nomes e extensões ficheiro tipo arq.txt Ficheiro de texto simples arq.c Código fonte em C arq.pdf Portable document format arq.html Ficheiro HyperText Markup Language arq.exe Ficheiro executável (Windows) arq* Ficheiro executável (Unix) arq.bmp Ficheiro de imagem bitmap arq.mp3 Ficheiro de áudio arq.png Ficheiro de imagem Portable Network Graphics arq.dll Biblioteca Exemplos comuns: 8 Pasta ou Diretório contém ficheiros e/ou outros diretórios Diretórios (ou pastas) cat.exels.exerm.exe file1.txt file2.c cat.txt 9 Caminho absoluto: Descrição de um caminho desde o diretório raiz: • Exemplo (linux) /bin/cat.exe /usr1/bill/file2.c • Exemplo (windows) Program Files\DVD-Maker\readme.txt Utilizadores\Paulo\arq.txt Caminho relativo: Descrição de um caminho desde o diretório corrente (ex: usr): bill/File2.c Caminhos absolutos ou relativos 10 nome do ficheiro; proprietário do ficheiro; datas de criação, alteração e acesso; tamanho em bytes; permissão de acesso. • r : leitura • w : escrita • x : execução Em linux ver os comandos ls -l e stat Em Windows ver o comando dir /A Atributos dos ficheiros 11 Fonte de dados para o programa: ficheiro de entrada (input) Destino dos dados do programa: ficheiro de saída (output) Utilização de Ficheiros 12 Dados de entrada para um programa são fornecidos a partir de periféricos de entrada (teclado, rato, leitor código barras, …) Dados de saída fornecidos pelo programa são enviados para periféricos de saída (monitor, impressora, …) Tipos de periféricos 13 Um ficheiro em C é visto como uma sequência (stream) de bytes... normalmente com uma marca que indica o fim do ficheiro, end-of-file (EOF). Linguagem C Criação de Ficheiros 14 Streams Em C, independentemente do tipo de periférico que se utilize, são processadas todas as entradas e saídas através de streams. 15 A um ficheiro aberto estará associado uma stream. Três canais (fluxos de dados) são automaticamente abertos quando um programa é iniciado: standard input, standard output e standard error. A abertura de um ficheiro devolve um apontador para uma estrutura FILE. Para os ficheiros standard, os apontadores são: stdin, stdout, e stderr. 16 Tipos de Ficheiros em C Ficheiro de texto - armazena carateres que podem ser mostrados diretamente no ecrã ou modicados por um editor de texto simples. Ficheiro binário – sequência de bits sujeita as convenções do programa que o gerou (exemplos: ficheiros executáveis, ficheiros compactados, ficheiros de registos). 17 Operações básicas sobre ficheiros O processo de trabalhar com ficheiros em C consiste em três etapas: 1. Abrir o ficheiro; 2. Ler e/ou gravar as informações desejadas no ficheiro; 3. Fechar o ficheiro. 18 Abertura do ficheiro Em C, para podermos trabalhar um ficheiro, precisamos de o abrir e associar a uma variável interna do programa. Para isso, usamos variáveis do tipo FILE * que podem ser declaradas assim: FILE *entrada; FILE *saida; A associação entre a variável e ficheiro é feita através da função fopen(), que funciona da seguinte maneira: entrada = fopen("ficheiro_entrada.txt", "r"); saida = fopen("ficheiro_saida.txt", "w"); 19 Abertura do ficheiro FILE *fich; fich = fopen(nome, modo de abertura); FILE é uma estrutura ficheiros FILE é uma estrutura nativa do C para o tipo de ficheiros Declaramos um estrutura Declaramos um apontador (*fich) para usar como variável para a estrutura O apontador será igual ao ficheiro devolvido pela função fopen() Este é nome (caminho relativo ou absoluto) do ficheiro O modo de abertura indica se queremos abrir / criar / recriar Se de erro o fica NULL Se de erro o apontador fica NULL 20 fopen( ) Protótipo da função de abertura: FILE *fopen (char *nome_ficheiro, char *modo); O parâmetro nome_ficheiro: é o nome e o local onde o ficheiro se encontra fisicamente ou, se for criado, onde o ficheiro deve ser armazenado. O parâmetro modo: especifica como o ficheiro deve ser aberto. 21 Modos de acesso/abertura 22 Exemplo de código A função fopen() tem duas finalidades: abrir uma fila de bytes (stream); ligar um ficheiro em disco à stream. FILE *fopen(char *NomeArquivo, char *modo); Se existir algum erro de abertura, a função fopen() devolve o valor NULL. 23 Programa-Exemplo i. Executar o programa. ii. Mudar o modo de abertura de w para r. iii. Mudar o nome do ficheiro para arquivo1.txt. iv. Mudar o caminho do ficheiro para a pasta Documentos do computador. 24 Fechar o ficheiro O processo de fechar o ficheiro serve para libertar a memória que foi utilizada para trabalhar com o ficheiro, além de permitir desbloqueá-lo para uso por outros programas (em execução simultânea). Esta tarefa é bem simples (e deve ser executada para cada ficheiro que foi aberto): fclose(entrada); fclose(saida); 25 fclose( ) Protótipo da função de fecho: int fclose (FILE *fich); O apontador fich é passado à função fclose() e determina o ficheiro a ser fechado. A função devolve o valor zero se o fecho do ficheiro foi bem sucedido ou a constante EOF (End Of File) em caso de erro. 26 Leitura de carateres de um ficheiro Para leitura de ficheiros existem quatro funções, sendo três análogas às usadas para saída padrão: Saída padrão Ficheiros Explicação getchar fgetc Recebe apenas um caractere. gets fgets Lê uma string (geralmente uma linha inteira). scanf fscanf Recebe uma string formatada. N/A fread Lê dados binários de um ficheiro. 27 fgetc( ) Protótipo: int fgetc (FILE *fich); A função fgetc() lê um carater no ficheiro passado por parâmetro (previamente aberto pela função fopen) e devolve-o como resultado da função. Se por acaso já não existir a qualquer carater no ficheiro, isto é, se a função detetar uma situação de End-Of-File devolve a constante EOF. 28 fgets( ) Protótipo: char *fgets (char *str, int tamanho,FILE *fich); A função fgets() lê uma linha inteira de uma vez. Recebe três argumentos: a string a ser lida, o limite máximo de caracteres a serem lidos e o ponteiro para FILE Se a função for executada com sucesso devolve o endereço da string lida, caso contrário retorna NULL. 29 fscanf( ) Protótipo: int fscanf (FILE *fp, char *str,...); A função fscanf() funciona como a função padrão scanf(), porém, ao invés de ler os dados de teclado, os dados são lidos de ficheiro. 30 Escrita de carateres para um ficheiro Para escrever em ficheiros existem quatro funções, sendo três análogas às usadas para saída padrão: Saída padrão Ficheiros Explicação putchar fputc Imprime apenas um caractere.puts fputs Imprime uma string diretamente, sem nenhuma formatação. printf fprintf Imprime uma string formatada. N/A fwrite Grava dados binários para um ficheiro. 31 fputc( ) Protótipo: int fputc (int ch, FILE *fich); A função fputc() escreve um caractere no ficheiro. 32 fputs( ) Protótipo: int fputs(const char *string, FILE *fich); A função fputs() escreve uma string para o ficheiro, mas não incluindo o caractere nulo. Se a função não for executada com sucesso devolve a constante EOF. 33 fprintf( ) Protótipo: int fprintf(FILE *fich, const char *format,...); A função fprintf() envia uma saída formatada para um ficheiro. 34 Outras funções úteis A função feof() devolve um valor não-zero se o ficheiro chegou ao EOF, caso contrário devolve zero: int feof (FILE *fich); Outra forma de se verificar se o final do ficheiro foi atingido é comparar o caractere lido por getc() com EOF. 35 A função ferror() devolve o valor zero se nenhum erro ocorreu e um número diferente de zero se algum erro ocorreu durante o acesso ao ficheiro: int ferror (FILE *fich); É útil para verificar se cada acesso a um ficheiro teve sucesso, de modo que consigamos garantir a integridade dos dados. Na maioria dos casos, se um ficheiro pode ser aberto, pode ser lido ou gravado. Porém, existem situações em que isto não ocorre (exemplo: pode acabar o espaço em disco enquanto gravamos, ou o disco pode estar com problemas e não conseguimos ler, etc.). Em conjunto com a ferror() é usada a função perror() (print error), cujo argumento é uma string que normalmente indica em que parte do programa o problema ocorreu. Prontos para a ação ?! 36 Hora de resolver… 37 1) Compilar o seguinte programa. ficheiro01.c 38 2) Criar no disco a pasta tmp e o ficheiro texto.txt. 3) Executar novamente o programa. 4) Abrir o ficheiro texto.txt com o Bloco de Notas e de seguida executar o programa. Verificar o que acontece. 39 5) Criar o seguinte programa. Tentar abrir texto.txt. ficheiro02.c 40 6) Criar o seguinte programa. Depois abrir texto.txt. ficheiro03.c 41 7) Implementar um programa cujo output seja semelhante ao seguinte: ficheiroDesafio1.c 42 8) Implementar um programa cujo output seja semelhante ao seguinte: ficheiroDesafio2.c 43 The Evolution of Data Storage
Compartilhar