Arquivos Prof. Luis Otavio Alvares 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. 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() 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"); } 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"); 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]); } // 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"); } Exercício 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: CARACTER EXISTENTE SUBSTITUIR POR A Z E Y I X O W U * //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"); } 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 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"); }