Cláudio C. Rodrigues Faculdade da Computação - UFU LINGUAGEM C 07: ARQUIVOS Trabalhando com arquivos O sistema de entrada e saída do ANSI C é composto por uma série de funções cujos protótipos estão reunidos em stdio.h. Todas estas funções trabalham com o conceito de "ponteiro de arquivo". Este não é um tipo propriamente dito, mas uma definição usando o comando typedef. Podemos declarar um ponteiro de arquivo da seguinte maneira: FILE *fd; fd" será então um ponteiro para um arquivo (descritor de arquivo). É usando este tipo de ponteiro que vamos poder manipular arquivos no C.
Abrindo arquivos FILE *fopen (char *nome_arq,char *modo); O parâmetro "nome_arq": é o nome e o local onde o arquivo se encontra ou, se for criado, onde o arquivo deve ser armazenado. O parâmetro "*modo": especifica como o arquivo deve ser aberto. No próximo slide apresentamos uma tabela com os modos de acesso possíveis: Modos de acesso Modo r w a rb wb ab r+ w+ a+ Significado Abre Arquivo de Texto para Leitura Cria Arquivo de Texto para Gravação Anexa a um Arquivo de Texto Abre Arquivo Binário para Leitura Cria Arquivo Binário para Gravação Anexa a um Arquivo Binário Abre Arquivo de Texto para Leitura/Gravação Cria Arquivo de Texto para Leitura/Gravação Abre ou Cria Arquivo de Texto para Leitura/Gravação r+b Abre Arquivo Binário para Leitura/Gravação w+b Cria Arquivo Binário para Leitura/Gravação a+b Abre ou Cria Arquivo Binário para Leitura/Gravação
fopen( ) A função fopen tem duas finalidades: - abrir uma fila de bytes - ligar um arquivo em disco àquela fila FILE *fopen(char *NomeArquivo, char *modo); Exemplo: FILE *fd; if ((fd= fopen( teste, w )) == NULL) { puts( Não posso abrir o Arquivo teste.\n ); exit(1); /* força o término da execução da rotina */ Introdução Linguagem C Fechando arquivos Função fclose() fecha um arquivo anteriormente aberto. int fclose (FILE *fd); O ponteiro fd passado à função fclose() determina o arquivo a ser fechado. A função retorna o valor zero se o fechamento do arquivo for bem sucedido.
Exemplo 1: Abrindo e fechando um arquivo #include <stdio.h> int main() { char *str1 = "/tmp/texto.txt"; FILE *fd; /* Declaração da estrutura */ fd=fopen (str1,"wb"); /* o arquivo se chama texto.txt está localizado no diretório /tmp */ if (!fd) printf ("Erro na abertura do arquivo."); else printf("arquivo aberto com sucesso."); fclose(fd); A condição!fd testa se o arquivo foi aberto com sucesso, porque no caso dê um erro, a função fopen() retorna um ponteiro nulo (NULL). Escrevendo caracteres em Arquivos Função putc() - escreve um caractere no arquivo previamente aberto int putc(int ch, FILE *fd); ch é o caracter a ser gravado fd é o ponteiro devolvido por fopen() Exemplo: putc( a, arquivo); Introdução Linguagem C
Lendo Caracteres de Arquivos Função getc() - retorna um caractere lido do arquivo. int getc(file *arquivo); Exemplo: ch = getc(arquivo); while (ch!= EOF) ch = getc(arquivo); Introdução Linguagem C Exemplo 2: int main() { FILE *arq; char ch; if ((arq=fopen( teste.dat, r )) == NULL) { printf( Arquivo não pode ser criado\n ); exit(1); do{ ch=getchar(); putc(ch,arq); while (ch!=0); fclose(arq); return 0;
Outras Funções para Arquivos feof() - retorna não-zero se o arquivo chegou ao EOF, caso contrário retorna zero. EOF ( end of file") - indica o fim de um arquivo. Às vezes é necessário verificar se um arquivo chegou ao fim, para isto podemos usar a função feof(). int feof (FILE *fp); ferror() - determina se a operação de arquivo produziu um erro. int ferror(file *fp); Introdução Linguagem C Outras Funções para Arquivos fseek() - Posiciona o arquivo em um ponto específico. int fseek(file *fp, long numbytes, int origem); origem pode ser: Começo do arquivo SEEK_SET 0 Posição corrente SEEK_CUR 1 Fim do arquivo SEEK_END 2 rewind() - reinicia o arquivo, ou seja movimenta o ponteiro do arquivo para seu início. void rewind(file *fp); Introdução Linguagem C
Lendo e escrevendo em um arquivo usando fprintf e fscanf Função fprintf () Escreve uma sequência de caracteres em um arquivo, essa função funciona como printf. A diferença é a saída padrão, que em fprintf é um arquivo e em printf é o monitor. int fprintf (FILE *fp, const char *format,...); "FILE *fp" - o arquivo a ser escrito. "const char *format" - o que será escrito. Lendo e escrevendo em um arquivo usando fprintf e fscanf Função fscanf() Lê uma constante de caracteres de um arquivo, essa função funciona como scanf. A diferença é a entrada padrão que em fscanf é um arquivo e em scanf é o teclado. em scanf é o teclado. int fscanf(file *fp, const char *format,...); "FILE *fp" - o arquivo a ser lido. "const char *format" - qual a variável que receberá os dados do arquivo.
Exemplo 3: #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char s[50],c; /* Lê um nome para o arquivo a ser aberto: */ printf("\n\n Digite o caminho completo inclusive o nome para o arquivo:\n"); gets(s); /* Caso ocorra algum erro na abertura do arquivo o programa será finalizado */ if (!(fp = fopen(s,"w"))) { printf("erro! Impossível abrir o arquivo!\n"); exit(1); /* Se não houve erro, escreve no arquivo...*/ fprintf(fp,"este e um arquivo chamado:\n%s\n", s); fclose(fp); /* fecha o arquivo */ /* abre novamente para a leitura */ fp = fopen(s,"r"); while (!feof(fp)) { fscanf(fp,"%c",&c); printf("%c",c); fclose(fp); return(0); Arquivos pré-definidos Ao iniciar a execução de um programa, o sistema automaticamente abre alguns arquivos pré-definidos: stdin: stdout: stderr: stdaux: stdprn: dispositivo de entrada padrão (geralmente o teclado); dispositivo de saída padrão (geralmente o vídeo); dispositivo de saída de erro padrão (geralmente o vídeo); dispositivo de saída auxiliar (associado à porta serial); dispositivo de impressão padrão (associado à porta paralela). Cada uma destas constantes pode ser utilizada como um ponteiro para FILE, para acessar os periféricos associados a eles. Por exemplo: c =getc(stdin); para efetuar a leitura de um caracter a partir do teclado, ou: putc(c, stdout); para imprimí-lo na tela.
Leitura e escrita de Strings Função fgets() Lê uma string de um arquivo. A função lê a string até que um caracter de nova linha seja lido /n ou tamanho-1 caracteres tenham sido lidos. Se o caracter de nova linha for lido, ele fará parte da string, o que não acontecia com gets. A string resultante sempre terminará com /0 (por isto somente tamanho-1 caracteres, no máximo, serão lidos). char *fgets (char *str, int tamanho, FILE *fp); "char *str": a variável que receberá a string. "int tamanho": limite de caracteres lidos. "FILE *fp": o arquivo que será lido. Leitura e escrita de Strings Função fputs() Escreve uma string em um arquivo. Esta função aceita um vetor de caracteres e um ponteiro para um objeto FILE (arquivo de escrita). Se o texto for escrito com sucesso um valor inteiro diferente de zero é retornado. Se houver erro na escrita, o valor EOF é retornado. int fputs (char *str, FILE *fp); "char *str": a variável que contém os dados a serem escritos no arquivo.. "FILE *fp": o arquivo que será escrito.
Leitura e Escrita em blocos Função fread() Leitura de bloco de dados. unsigned fread (void *buffer, int numero_bytes, int count, FILE *fp); "void *buffer" variável que armazena os dados lidos. "int numero_de_bytes" - o número de bytes a ser lido. "int count" - indica quantas unidades devem ser lidas. "FILE *fp" - arquivo a ser lido. Introdução Linguagem C Leitura e Escrita em blocos Função fwrite() Escrita de bloco de dados. unsigned fwrite(void *buffer, int numero_bytes, int count, FILE *fp); "void *buffer" variável que armazena os dados a serem escritos. "int numero_de_bytes" - o número de bytes a ser escrito. "int count" - indica quantas unidades devem ser escritas. "FILE *fp" - arquivo a ser escrito. Introdução Linguagem C
Exemplo 4: int main() { FILE *fp; float f = 12.23; if ((fp=fopen( teste, wb )) == NULL) { printf( Arquivo não pode ser criado\n ); exit(1); fwrite(&f,sizeof(float(),1,fp); fclose(fp); return 0; Exemplo 5: Leitura de um caracter em um arquivo binário int main() { FILE *fp; if ((fp=fopen( teste, rb )) == NULL) { printf( O arquivo não pode ser aberto\n ); exit(1); /* L força que seja um inteiro longo */ fseek(fp,234l,0); /* lê o caracter 234 */ return getc(fp);
Exemplo 5: Arquivo Cadastro Leitor() { FILE *fp; int i; if ((fp=fopen( LISTA.DAT, rb )) == NULL) { puts( Falha na Abertura do Arquivo! ); return; inicia_matriz(); for (i=0; i < 100; i++) if (fread(&matriz[i], sizeof(struct registro), 1, fp)!= 1) { if (feof(fp)) { fclose(fp); return; else { puts( Erro de Leitura! ); fclose(fp); return; Exemplo 5: Arquivo Cadastro Escritor() { FILE *fp; int i; if ((fp=fopen( LISTA.DAT, wb ))==NULL) { puts( Falhou Abertura! ); return; for (i=0;i<100;i++) if (*matriz[i].nome) if(fwrite(&matriz[i], sizeof(struct registro), 1,fp)!= 1) puts( Falha na Gravacao! ); fclose(fp);
Exemplo 6: Cópia de Arquivos #include stdio.h int main(int argc,char* argv[]) { FILE *in, *out; char ch; if (arg!= 3) { printf( Digite o Nome dos Arquivos\n ); exit(1); if ((in=fopen(argv[1], rb )) == NULL) { printf( Arquivo origem não existe\n ); exit(1); if ((out=fopen(argv[2], wb )) == NULL) { printf( Arquivo destino não existe\n ); exit(1); while (! feof(in)) putc(getc(in),out); /* esta é a cópia propriamente dita */ fclose(in); fclose(out); return 0; Bibliografia Pereira, S.L., Linguagem C Distribuição gratuita Schildt, H., C Completo e Total, Editora Makron Books do Brasil Editora Ltda, 1996. Evaristo, J., Aprendendo a programar programando em linguagem C, Book Express, 2001. Mizrahi, V. V., Treinamento em Linguagem C, Curso Completo, Módulos 1 e 2, Makron Books do Brasil Editora Ltda,1990. Kernighan, B.W & Ritchie, D. M., C a Linguagem de Programação, Editora Campus, 1986. Faculdade da Computação - UFU 26
Dúvidas? Faculdade da Computação - UFU 27