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 2 - 3 Linguagem C Ficheiros de Texto 4 Antes de se começar a ler ou escrever num ficheiro, deve ser chamada a função fopen() para abrir o ficheiro. A função fopen() tem 2 argumentos: o primeiro é o nome do ficheiro e o segundo indica se o ficheiro vai ser aberto para leitura ou escrita ("r" ou "w" respetivamente. Estes nomes vêm do inglês, r-read, w-write). Depois de abrir o ficheiro deve-se testar se a operação foi bem sucedida. Para tal, compara-se o valor de f com a constante NULL. Caso haja um erro, podemos escrever no ecrã uma mensagem de erro e terminar o programa. Se o ficheiro foi aberto com sucesso, poderemos ler e escrever. No final, devemos fechar os ficheiros (anteriormente abertos) com a função fclose(). Abertura e fecho de ficheiros de texto 5 Antes de se começar a ler ou escrever num ficheiro, deve ser chamada a função fopen() para abrir o ficheiro. A função fopen() tem 2 argumentos: o primeiro é o nome do ficheiro e o segundo indica se o ficheiro vai ser aberto para leitura ou escrita ("r" ou "w" respetivamente. Estes nomes vêm do inglês, r-read, w-write). Depois de abrir o ficheiro deve-se testar se a operação foi bem sucedida. Para tal, compara-se o valor de f com a constante NULL. Caso haja um erro, podemos escrever no ecrã uma mensagem de erro e terminar o programa. Se o ficheiro foi aberto com sucesso, poderemos ler e escrever. No final, devemos fechar os ficheiros (anteriormente abertos) com a função fclose(). 6 Ficheiros de Texto Ficheiro de texto - armazena carateres que podem ser mostrados diretamente no monitor do computador ou modicados por um editor de textos simples. 7 As operações de entrada e saída do C, incluindo as relacionadas a ficheiros, encontram-se na biblioteca stdio.h que também define várias macros, dentre elas NULL e EOF (apontador nulo e o fim de ficheiros, respetivamente). Além disso, é nela que está definido o tipo FILE. Um ficheiro de texto não é mais do que uma sequência de caracteres que ficam armazenados no disco do computador. Esta sequência de caracteres é terminada com um caracter especial denominado fim-de-ficheiro (EOF). (Este caracter especial não é visível no ficheiro) EOF 8 Um ficheiro de texto pode ser criado com um editor de texto. É precisamente isso que fazem nas aulas práticas quando escrevem os vossos programas. No entanto, nada impede que escrevam outras coisas. Com um editor de texto, podem escrever cartas, poesias, relatórios de trabalhos, e claro que também podem escrever programas em C. Em C, podemos dar instruções ao programa para ler e escrever em ficheiros de texto, em vez de ler do teclado e escrever no ecrã. Isto tem a vantagem de não se ter de estar sempre a introduzir os dados. 9 Leitura e escrita em ficheiros de texto Para um programa ler e escrever em ficheiros de texto, podemos utilizar as funções fscanf() e fprintf(). Estas funções são praticamente iguais ao scanf() e printf(). A única diferença é que as funções têm um argumento adicional que indica o ficheiro em que se pretende ler ou escrever. Exemplo: fscanf( f, "%d", &n ); A variável f é uma variável que tem de ser associada previamente a um ficheiro, e que se declara como sendo do tipo FILE (exemplo: FILE *f;). 10 A leitura e escrita são feitas sequencialmente do inicio para o fim do ficheiro. O código-exemplo que se segue é um programa que lê dois números de um ficheiro chamado "dados.txt" e escreve o quadrado desses números num ficheiro novo chamado "resultados.txt“. Código-exemplo 11 fichTexto01.c 12 13 É possível ler ou escrever dados de forma formatada em ficheiros através das funções fscanf() e fprintf(). int fscanf(FILE *fich, const char *format, ...); int fprintf(FILE *fich, const char *format, ...); Estas funcionam da mesma forma que as funções padrão scanf() e printf(), tendo apenas mais um parâmetro inicial que corresponde ao ficheiro onde o processamento irá ser realizado. A função fscanf() devolve EOF se tiver detetado o final do ficheiro (End-of-File) ou devolve o número de parâmetros que conseguir ler com sucesso. Input e Output formatado 14 Em C, também existem funções específicas que permitem ler um carater e escrever um carater: getchar() e putchar(). Também existem as respetivas variantes que permitem ler/escrever um carater de/para um ficheiro. Essas funções são fgetc() e fputc(). char c; c = fgetc(f); /*equivalente a fscanf(f,"%c",&c) */ fputc('z'); /* equivalente a fprintf(f, "z") */ 15 Leitura caracter a caracter O programa-exemplo apresentado anteriormente (fichTexto01.c) não faz qualquer tipo de validação. Por exemplo, se o ficheiro de entrada tiver apenas um número, o programa irá funcionar mal. Ao tentar fazer o segundo fscanf(), o programa já vai estar a aceder a coisas que estão depois do fim-de-ficheiro. Isso é equivalente a termos um vetor de dimensão 10 e tentarmos aceder à posição 12! A solução para este problema é verificar se já chegamos ao fim do ficheiro imediatamente antes de tentarmos ler qualquer coisa. Na biblioteca padrão stdio.h existe uma constante chamada EOF (end of file) que significa fim-de- ficheiro. 16 O código-exemplo que se segue programa que converte o conteúdo de um ficheiro de texto para maiúsculas. A ideia é abrir o ficheiro de entrada e ir lendo os carateres um após outro até chegar ao fim do ficheiro. Cada caracter lido é convertido para maiúsculas e escrito para o ficheiro de saída. Código-exemplo 17 fichTexto02.c 18 Nota: A função toupper() está definida em ctype.h e converte o caracter de entrada para maiúscula. 19 Vamos supor que temos um ficheiro chamado nomes.txt cujo conteúdo são nomes de pessoas, um nome por linha. Pretende-se fazer um programa que leia esses nomes para um vetor de nomes. Código-exemplo 20 fichNomes.c 21 Nota: Falta codificar a saída do vetor para exibir no ecrã. 22 Principais funções de manipulação de ficheiros da biblioteca stdio.h Função O que faz? fopen() Abre um ficheiro. fclose() Fecha o ficheiro garantindo a transferência do buffer. fflush() Descarrega o buffer. fscanf() Leitura de entrada formatada (semelhante ao scanf()). fprintf() Escrita de saída formatada (semelhante ao printf()). fgets() Obtém uma string do ficheiro. fgetc() Obtém um carácter do ficheiro. fputs() Insere uma string no ficheiro. fputc() Insere um carácter no ficheiro. fread() Lê um bloco um bloco de dados do ficheiro. fwrite() Escreve um bloco de dados no ficheiro. fseek() Reposiciona o apontador no ficheiro. rewind() Reposiciona o apontador para o início do ficheiro. ftell() Retorna a posição do apontador. 23 Modos de abertura de ficheiros Modo O que faz? “r” Abre o ficheiro somente para leitura, a partir do início. O ficheiro deve existir. “w” Cria um ficheiro vazio para escrita. Se já existir o ficheiro, este será perdido. “a” Adiciona no final do ficheiro. Se o ficheiro não existir, a função cria-o. “r+” Abre o ficheiro para leitura e escrita, a partir do início. O ficheiro deve existir. “w+” Cria um ficheiro vazio para leitura e escrita. Se já existir o ficheiro, este será perdido. “a+” Abre para adição ou leitura no final do ficheiro. Se o ficheiro não existir, a função cria-o. No Windows, o caracter “b” pode ser adicionado ao modo (ex: “ab”, “w+b”) para especificar que o ficheiro deve ser aberto no modo binário. Em sistemas POSIX (inclusive Linux), este caracter é ignorado. Também é possível utilizar o caracter “t”, para abertura de no modo texto. Prontos para a ação ?! 24 Hora de resolver… 25 1) Implementar no programa-exemplo fichTexto01.c uma rotina de validação para detetar o fim de ficheiro. 2) Implementar no programa-exemplo fichTexto02.c uma rotina de modo a pedir ao utilizadorpara introduzir o nome dos ficheiros de entrada e saída. 3) Supor que existe um ficheiro que contém em cada linha o nome de um aluno (apenas uma palavra) e a sua respetiva classificação (0 a 20) numa qualquer prova final. Escrever um programa que mostre no ecrã apenas os alunos que obtiveram aprovação e respetivas notas (classificação >=10) na disciplina a que o ficheiro corresponde. 26 4) Implementar um programa que abra um ficheiro de texto indicado pelo utilizador e conte o número de caracteres existentes no ficheiro e que faça a impressão do número de caracteres no ecrã. 6) Implementar um programa que lê um número N e que gere N números inteiros (entre 0 e 100) para guardar todos num ficheiro de texto. A primeira linha do ficheiro deverá conter a quantidade de números e as restantes os números gerados, cada linha com o máximo de 10 números. 7) Implementar um programa que crie um ficheiro de texto contento os nomes das capitais de distrito e respetivas temperaturas máxima e mínima num dado dia. Hora de resolver… 5) Implementar no programa-exemplo fichNomes.c uma rotina de exibir os dados inseridos no vetor. 27 8) Escrever e testar uma rotina destinada a gerir a abertura de um ficheiro com proteção relativamente a erros. A proteção relativamente a erros coloca-se da seguinte forma: • se a abertura for para leitura ou acrescentar linhas temos de verificar se o ficheiro já existe; • se a abertura for para escrita não devemos permitir criar inadvertidamente (e, consequentemente, apagar) um ficheiro que já existe. 28
Compartilhar