You are on page 1of 3

Arquivos

1 Introduo ca
Todos os exemplos que vimos at aqui usavam a entrada/sa padro para leitura/escrita de dados. e da a Esta interface para interao entre programa e usurio automaticamente denida pelo sistema opeca a e racional, ou seja, ao comear a execuo de um programa em C, o sistema operacional responsvel c ca e a por criar trs meios de conexo com o programa (stdin, stdout e stderr. Normalmente o stdin e a est vinculado ao teclado e stdout e stderr esto vinculados ao v a a deo. Nesta aula, veremos como um programa pode interagir atravs do uso de arquivos que no so automaticamente vinculados ao e a a programa. Um arquivo (= le) uma sequncia de bytes que reside em um dispositivo de armazenamento e e secundrio (hd, ssd, tas magnticas, cd/dvd, pendrive). Embora um arquivo tenha estrutura semea e lhante ` memria RAM do computador, os bytes de um arquivo no podem ser endereados individua o a c almente, isto , para acessar um determinado byte, deve-se percorrer sequencialmente todos os bytes e anteriores. Isto faz com que o acesso aos dados em memria secundria seja muito mais lento que o o a acesso aos dados em memria principal e, consequentemente, o uso de arquivos torna a execuo do o ca programa mais lenta. Por outro lado, em algumas aplicaes, a persistncia de dados necessria, co e e a ou seja, os dados no podem ser perdidos entre uma execuo e outra (armazenamento no-voltil de a ca a a dados). Outra caracter stica que justica o uso de arquivos que nem sempre poss ter todos os e e vel dados em memria principal (manipulamos apenas parte dos dados por vez). o

Abertura e fechamento

Para estabelecer uma conexo entre o programa na memria principal e o arquivo residente em memria a o o secundria, precisamos usar uma operao de associao que tem como funo abrir o arquivo. Isto a ca ca ca feito atravs da funo fopen (= le open). Esta funo recebe um nome externo (por exemplo, e e ca ca nome.txt), faz algumas negociaes com o sistema operacional (detalhes que no nos interessa a co a princ pio) e devolve um ponteiro que ser usado para leituras e escritas subsequentes. a Este ponteiro, chamado de ponteiro para arquivo (le pointer ), aponta para uma estrutura que contm informaes sobre o arquivo, tais como: a localizao do buer de transferncia de dados e co ca e alocado para o arquivo, a posio atual de um caractere no buer, se o arquivo est sendo lido ou ca a escrito, e se houve erros ou se o m de arquivo foi encontrado. Os usurios no precisam saber os detalhes, porque as denies obtidas da biblioteca <stdio.h> a a co incluem uma declarao chamada FILE. A unica declarao necessria para um ponteiro para arquivo ca ca a exemplicada abaixo: e FILE *fp; FILE *fopen(char *name, char *mode); Isto informa que fp um ponteiro para um FILE, e que fopen devolve um ponteiro para um FILE. e A chamada de fopen em um programa : e fp = fopen("nome", "modo"); O primeiro argumento para fopen uma cadeia de caracteres contendo o nome do arquivo. O e segundo argumento o modo, tambm uma cadeia de caracteres, que indica como pretende-se usar o e e arquivo. Modos permitidos incluem a leitura (r), escrita (w), e anexao (a). Alguns sistemas ca distinguem entre arquivos de texto e arquivos binrios (para este ultimo, um b deve ser apensado a na especicao do modo). ca Se o nome de um arquivo inexistente passado como argumento para fopen e o modo de abertura e e para escrita ou anexao, ento o arquivo criado se poss ca a e vel. A abertura de um arquivo existente com o modo escrita especicado faz com que o contedo antigo seja descartado, enquanto que abrindo-o u 1

com o modo anexao faz com que o contedo seja preservado. Tentar ler um arquivo inexistente ca u e um erro, assim como tentar ler um arquivo que voc no possua permisso. Se houver algum erro, a e a a funo fopen ir devolver NULL. ca a Depois de usar o arquivo, preciso fech-lo com a funo fclose (= le close). O fechamento e a ca e importante porque: se o arquivo foi aberto para gravao e o buer no foi completamente preenchido, o fechamento ca a garante que ele seja descarregado em disco. o fechamento libera a rea de conexo alocada na abertura do arquivo. a a A funo fclose ser chamada automaticamente para cada arquivo aberto quando o programa ca a termina normalmente. Para fechar todos os arquivos abertos, de uma s vez, usamos a funo o ca fcloseall(), que no requer argumentos. a

Leitura e gravao ca

Para efetuar leitura e gravao em um arquivo de texto, podemos utilizar as seguintes funes (existem ca co outras, mas estas so as principais): getc, putc, fprintf, fscanf, fgets e fputs a int getc (FILE *fp); Funo que devolve um caractere lido do arquivo (note que a funo ca ca devolve um int e no um char). Recebe como parmetro o arquivo a ser lido. a a int putc (int ch, FILE *fp); Funo que escreve um caractere no arquivo. Recebe como ca parmetros o caractere a ser escrito no arquivo (pode ser uma varivel) e o arquivo a ser escrito. a a char *fgets (char *str, int size, FILE *fp); Funo que l uma string de um arquivo. ca e A funo l a string at que um caractere de nova linha (/n) seja lido ou size-1 caracteres ca e e tenham sido lidos. Se o caractere de nova linha for lido, ele far parte da string (o que no a a acontece com gets alis, recomenda-se no usar gets). A string resultante sempre terminar a a a com /0 (por isto somente size-1 caracteres, no mximo, sero lidos). A funo recebe como a a ca parmetros a varivel que receber a string, o limite mximo de caracteres a serem lidos e o a a a a arquivo que ser lido. a char *fputs (char *str, FILE *fp); Funo que escreve uma string num arquivo. Recebe ca como parmetros a varivel que contm os dados a serem escritos no arquivo e o arquivo a ser a a e escrito. int fscanf (FILE *fp, const char *format,...); Funo que l dados de um arquivo ca e conforme o formato denido em uma constante de caracteres (semelhante ao scanf). Recebe como parmetros o arquivo a ser lido, uma constante de caracteres denindo o formato, e a a sequncia de variveis que recebero os dados. A funo fscanf, tal como a funo scanf, e a a ca ca devolve o nmero de elementos efetivamente lidos. u int fprintf (FILE *fp, const char *format,...); Funo que escreve uma string em ca um arquivo conforme formato denido pela constante de caracteres (semelhante ao printf). Recebe como parmetros o arquivo a ser escrito, o formato da string a ser escrita, e poss a veis variveis ou valores necessrios para escrev-la. a a e

Identicando nal de arquivo e erros

A funo ferror (prottipo int ferror(FILE *fp)) devolve algo diferente de zero se um erro ocorreu ca o no canal (stream) estabelecido atravs do ponteiro para arquivo fp. e Embora erros de arquivo sejam raros, eles ocorrem quando, por exemplo, o disco est cheio, ento, a a um programa que escreve dados em um arquivo deve vericar este tipo de ocorrncia. e

Durante a leitura de um arquivo, frequentemente, precisamos saber se todos os seus dados j foram a lidos. Para isso, usamos a funo feof, que informa quando o nal de arquivo foi atingido. ca A funo feof (prottipo int feof(FILE *)) anloga a ferror; ela devolve algo diferente de ca o e a zero se um m de arquivo foi encontrado para o arquivo especicado.

Um exemplo

Primeiramente crie um arquivo in.txt com algum editor de texto. O programa a seguir faz leitura linha a linha do arquivo in.txt e grava uma cpia do arquivo com o nome out.txt. o
#include<stdio.h> #include<stdlib.h> int main(void) { FILE *infp, *outfp; char str[80]; if ((infp = fopen("in.txt", "r")) == NULL) { fprintf(stderr, "Cant open input file in.txt!\n"); return EXIT_FAILURE; } if ((outfp = fopen(out.txt, "w")) == NULL) { fprintf(stderr, "Cant open output file out.txt!\n"); return EXIT_FAILURE; } while (!feof(infp)) { fgets(str, 80, infp); fprintf(outfp, "OK! - %s", str); } fclose(infp); fclose(outfp); return EXIT_SUCCESS; }

Exerc cios
1. Reescreva o exemplo anterior, mas agora lendo/escrevendo caractere a caractere. 2. Faa um programa que compare dois arquivos, imprimindo a primeira linha onde eles diferem. c 3. Escreva um programa que conta o nmero de ocorrncias de cada caractere em um arquivo. u e O programa solicita o nome do arquivo ao usurio e imprime uma tabela que d o nmero de a a u ocorrncias de cada caractere. e

Referncias e
http://www.cplusplus.com/reference/clibrary/cstdlib/ http://www.ime.usp.br/ pf/algoritmos/aulas/io.html SILVIO DO LAGO PEREIRA. Linguagem C. KERNIGHAN, Brian W. and RITCHIE, Dennis M. The C programming language. PrenticeHall, 1988

You might also like