Arquivos Prof. Luiz José Hoffmann Filho [email protected] 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 Ponteiro de Arquivo É um ponteiro para informações que definem várias coisas sobre o arquivo, incluido nome, status e a posição atual do arquivo. Basicamente, o ponteiro de arquivo identifica um arquivo específico em disco e é usado pela stream associada para direcionar as operações funções de e/s. #include <stdio.h> FILE *fp; 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 ◦ b para quando se tratar de arquivo binário. A função fclose() A função fclose() fecha um stream que foi aberto por meio de uma chamada a fopen(); Protótipo da função : int fclose(FILE *fp); Exemplo: fclose(arquivo); - Erros retornados pela função ferror. Exemplo de uso #include<stdio.h> #include<stdlib.h> int main(){ FILE *arquivo; //vai ser associada ao arquivo arquivo = fopen("c:/luiz/teste9.txt",”w"); if(arquivo==NULL) printf(”Arquivo não pode ser aberto\n"); else printf("Arquivo aberto com sucesso\n"); fclose(arquivo); //fecha arquivo return 0; } Leitura e gravação putc(int, arquivo) getc(arquivo) Ex: do { ch = getc(fp); } while(ch != EOF); Ambas devolver EOF ao chegar no final do arquivo Exemplo : Escrita em um arquivo #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char ch; if(argc!=2) { printf(“Você esqueceu de digitar o nome do arquivo\n”); return 0; } if((fp = fopen(argv[1], “w”))== NULL) { printf(“O arquivo não pode ser aberto.\n”); return 0; } do { scanf(“%c”, &ch); putc(ch, fp); } while(ch!=‘$’); fclose(fp); return 0; } Exemplo: Lendo de um arquivo #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char ch; if(argc!=2) { printf(“Você esqueceu de digitar o nome do arquivo\n”); return 0; } if((fp = fopen(argv[1], “r”))== NULL) { printf(“O arquivo não pode ser aberto.\n”); return 0; } ch = getc(fp); /*lê um caractere*/ while (ch!=EOF){ putchar(ch); ch = getc(fp); } fclose(fp); return 0; } As funcões fputs() e fgets(); Efetuam as operações de leitura e gravação de strings de caractere de e para um arquivo em disco. Protótipos: int fputs(const char *str, FILE *fp); char *fgets(char *str, int length, FILE *fp); Fputs() opera como o puts(), mas escreve a string na stream especifica. EOF será devolvido se ocorrer um erro. Fgets() lé uma string da stream especificada até que um caractere de nova linha seja lido ou que length-1 caracteres tenham sido lidos. A string resultante será terminada por um nulo. A função retorna um ponteiro para str se bem-sucedida ou um ponteiro nulo se ocorrer um erro. Exemplo: fgets(), fputs() #include <stdio.h> #include <string.h> int main() { char str[80]; FILE *fp; if((fp = fopen(“TEST”, “w”)) == NULL) { printf(“O arquivo não pode ser aberto.\n”); return 0; } do { printf(“Digite um string :\n”); fgets(str, 80, stdin); strcat(str, “\n”); fputs(str, fp); } while(*str != “\n”); fclose(fp); return 0; } Função rewind() Reposiciona o indicador de posição de arquivo no início do arquivo especificado como seu argumento. Isto é, ele “rebonina” o arquivo. Protótipo : void rewind(FILE *fp); Exemplo usando a função rewind() #include <stdio.h> #include <string.h> int main() { char str[80]; FILE *fp; if((fp = fopen(“TEST”, “w+”)) == NULL) { printf(“O arquivo não pode ser aberto.\n”); return 0; } do { printf(“Digite um string :\n”); fgets(str, 80, stdin); strcat(str, “\n”); fputs(str, fp); } while(*str != “\n”); rewind(fp); while(!feof(fp)){ fgets(str,79,fp); printf(“%s”, str); } fclose(fp); return 0; } Funções fprintf() e fscanf() A função fprintf() permite escrever em um arquivo da mesma forma que escrevemos na tela com o printf(); Seu protótipo é: int fprintf(FILE *fp, char *formato,….); A função fscanf() lê informações de um arquivo da mesma forma que lemos do teclado com o scanf() Seu protótipo é: int fscanf(FILE *fp, char *formato,….); Exemplo: #include <stdio.h> #include <stdlib.h> int main(){ FILE *arq; char nome1[20], nome2[20], linha[20]; arq = fopen("teste.txt", "w"); printf("entre nome1: "); scanf("%s", nome1); printf("entre nome2: "); scanf("%s", nome2); fprintf(arq, "%s\n%s", nome1, nome2); fclose(arq); arq = fopen("teste.txt", "r"); printf("lendo do arquivo:\n"); fscanf(arq, "%s", nome1); fscanf(arq, "%s", nome2); printf("nome1: %s\nnome2: %s\n", nome1, nome2); return 0; } Exercícios Faça um programa que crie um arquivo TEXTO em disco, com o nome “dados.txt”, e escreva neste arquivo em disco uma contagem que vá de 1 até 100, com um número em cada linha. Abra este arquivo em um editor de textos, como por exemplo o Notepad ou o Wordpad do Windows. Faça um programa, um que leia o arquivo TEXTO criado no exercício 1. Exibir na tela os dados lidos dos respectivos arquivos. Exercícios Faça um programa que leia o nome e sobrenome de 30 alunos e armazene em um arquivo, de tal forma que o arquivo tenha um aluno por linha. Faça um programa que leia um vetor de inteiros A de tamanho 20 e guarde seus valores em um arquivo, um por linha. Em seguida, reabra o arquivo e leia os elementos para o vetor B, verificando se os valores foram gravados corretamente. Exercícios Faça um programa que leia (do teclado) um cadastro de 10 alunos, indicando o nome, nota1, nota2. Calcule a média aritmética simples dos 10 alunos e depois escreva em um arquivo texto os dados de cada aluno: nome, nota1, nota2 e média. Lembre-se de que as notas e média deverão ser apresentadas como valores que possuem até 2 casas após a vírgula.