Baixe o app para aproveitar ainda mais
Prévia do material em texto
11/18/2015 1 Linguagens e Programação Prof. Dr. Paulo Nazareno Maia Sampaio Aula 7 SUMÁRIO 6 Linguagens e Programação Arquivos 11/18/2015 2 Introdução a linguagem C utiliza o conceito de fluxo (stream) de dados para manipular vários tipos de dispositivos de armazenamento. Dados podem ser manipulados em dois diferentes tipos de fluxos: fluxos de texto e fluxos binários. Um fluxo de texto é composto por uma seqüência de caracteres, que pode ou não ser dividida em linhas terminadas por um caracter de final de linha. Arquivos Um arquivo pode estar associado a qualquer dispositivo de entrada e saída, como por exemplo: teclado, video, impressora, disco rígido, etc. • O processo de trabalhar com arquivos em C consiste em três etapas: 1. Abrir o arquivo; 2. Ler e/ou gravar as informaçõeses desejadas no arquivo; 3. Fechar o arquivo. 11/18/2015 3 Funções de entrada e saída As funções mais usadas estão armazenadas na biblioteca stdio.h • fopen() - Abre um arquivo • fputc() - Escreve um caracter em um arquivo • fgetc() - Lê um caracter de um arquivo • fputs() – escreve uma string em um arquivo • fgets() – lê uma linha de um arquivo • fprintf()- Equivalente a printf() • fscanf() - Equivalente a scanf() • rewind() - Posiciona o arquivo no início • feof() - Retorna verdadeiro se chegou ao fim do arquivo • fclose() – fecha Abertura de arquivo Antes de qualquer operação ser executada com o arquivo, ele deve ser aberto. Esta operação associa um fluxo de dados a um arquivo. Um arquivo pode ser aberto de diversas maneiras: leitura, escrita, leitura/escrita, adicão de texto, etc. A função utilizada para abrir o arquivo é fopen() 11/18/2015 4 A função fopen() fopen(nome arquivo,modo de uso). Os modos de uso mais comuns são: r (de read) : abre um arquivo texto para leitura w (de write) : cria um arquivo texto para escrita a (de append) : para adicionar conteúdo no fim de um arquivo texto já existente r+ : abre um arquivo texto para leitura/escrita w+ : cria um arquivo texto para leitura/escrita Exemplo de uso #include<stdio.h> #include<stdlib.h> int main(){ FILE *arquivo; //vai ser associada ao arquivo arquivo = fopen("c:/luis/teste9.txt","r"); if(arquivo==0) printf("Erro na leitura do arquivo\n"); else printf("Arquivo aberto com sucesso\n"); fclose(arquivo); //fecha arquivo system("pause"); } 11/18/2015 5 Leitura e gravação fgets (string, tamanho, arquivo) fputs(string, arquivo) fgetc(arquivo) fputc(char, arquivo) Exemplo: programa que faz copia de um arquivo //copia o conteudo do arquivo tmp.txt em tmpCopy.txt #include<stdio.h> #include<stdlib.h> #define MAX 80 main(){ int ch; char linha[MAX]; FILE *input, *output; // uma forma de copiar (linha a linha) input = fopen( "tmp.txt", "r" ); if(input){ output = fopen( "tmpCopy2.txt", "w" ); fgets(linha, MAX, input); while(!feof(input) ) { fputs( linha, output ); fgets(linha, MAX, input); } fputs( linha, output ); //para escrever a ultima linha (do EOF) fclose( input ); fclose( output ); } else printf ("deu erro na abertura do arquivo tmp.txt\n"); system("pause"); 11/18/2015 6 continuação // outra forma de copiar (caracter a caracter) input = fopen("tmp.txt", "r"); if(input){ output = fopen( "tmpCopy.txt", "w" ); ch = fgetc( input ); while( ch != EOF ) { fputc( ch, output ); ch = fgetc( input ); } fclose( input ); fclose( output ); } else printf ("deu erro na abertura do arquivo tmp.txt\n"); system("pause"); } Exemplo mais completo // grava o nome de cinco alunos em um arquivo e depois le o arquivo e // mostra os nomes escritos #include <stdio.h> #include <string.h> #include <stdlib.h> main(){ FILE *p; char c, str[30], frase[80] = "Este e um arquivo chamado: “; char alunos [5][50], mostratexto [50]; int i,j=0, cont=0; // Le um nome para o arquivo a ser aberto: printf("\n\n Entre com um nome para o arquivo:\n"); gets(str); // le os nomes dos alunos e coloca no vetor alunos for (cont=0;cont<5;cont++) { printf ("\nInforme o nome do aluno %d: ", cont+1); gets(alunos[cont]); } ... 11/18/2015 7 // abre o arquivo para gravacao if (!(p = fopen(str,"w"))) // Caso ocorra algum erro na abertura //do arquivo da' mensagem e nao faz nada { printf("Erro! Impossivel abrir o arquivo!\n"); } else { // Se nao houve erro, grava o arquivo e o fecha ... for (i=0; i<5; i++){ strcat(alunos[i], "\n"); //concatena o \n no final da linha fputs(alunos[i],p); // grava no arquivo p } fclose(p); // fecha o arquivo ao final da gravacao printf("\nTerminei de escrever, agora vou ler.\n"); // Abre novamente, agora para leitura p = fopen(str,"r"); //uma forma de mostrar fgets(mostratexto, 50, p); while (!feof(p)) // Enquanto não chegar no final do arquivo p { printf("%s",mostratexto); fgets(mostratexto, 50, p); } fclose(p); // Fecha o arquivo p ... // outra forma de mostrar printf("\nde novo\n"); p = fopen(str,"r"); for (i=0; i<5; i++){ fgets(alunos[i], 50, p); printf("%s",alunos[i]); } fclose(p); // Fecha o arquivo } // do else de erro de abertura do arquivo system("pause"); } 11/18/2015 8 Exercício CARACTER EXISTENTE SUBSTITUIR POR A Z E Y I X O W U * Faça um programa que decodifique um determinado texto gravado em um arquivo, a partir da seguinte tabela de substituição de caracteres, gerando um novo arquivo: //copia o conteudo do arquivo tmp.txt em tmpCopy.txt, com alteracoes #include<stdio.h> #include<stdlib.h> main(){ int c; FILE *ent, *sai; ent = fopen(“tmp.txt", "r"); if(ent){ sai = fopen( "tmpCopy.txt", "w" ); c = fgetc( ent ); while( c != EOF ) { switch (c) { case 'A': c='Z';break; case 'E': c='Y';break; case 'I': c='X';break; case 'O': c='W';break; case 'U': c='*';break; } fputc( c, sai ); c = fgetc( ent ); } fclose( ent ); fclose( sai ); } else printf ("deu erro na abertura do arquivo tmp.txt\n"); system("pause"); } 11/18/2015 9 Exercício Considere um arquivo tipo texto já gravado. Gere um novo arquivo com uma nova linha, com dados lidos do teclado, entre a terceira e a quarta linha deste texto. Mostre o conteudo do arquivo original e do novo. Exemplo de solução //copia o conteudo do arquivo original.txt em copia.txt #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX 150 main(){ int i; char linha[MAX]; FILE *entrada, *saida; entrada = fopen( "original.txt", "r" ); if(entrada){ saida = fopen( "copia.txt", "w" ); for (i=1;i<4;i++){ fgets(linha, MAX, entrada);//le as primeiras linhas fputs(linha, saida ); // copia para o arquivo de saida } printf("Informe o conteudo da linha a ser inserida: "); gets(linha); strcat(linha,"\n"); fputs(linha, saida ); // escreve a linha adicionada … 11/18/2015 10 continuação // copia o resto do arquivo, sem alteracao fgets(linha, MAX, entrada); while(!feof(entrada) ) { fputs( linha, saida ); fgets(linha, MAX, entrada); } fputs( linha, saida ); //para escrever a ultima linha (do EOF) fclose( entrada ); fclose( saida ); } else printf ("deu erro na abertura do arquivo original.txt\n"); system("pause"); } Referências 1. Alvares, L. O. “Arquivos”. (disponível na web) 11/18/2015 11 Linguagens e Programação Prof. Dr. Paulo Nazareno Maia Sampaio Aula 7
Compartilhar