arquivos

Upload: luana-marques

Post on 14-Jan-2016

215 views

Category:

Documents


0 download

DESCRIPTION

arquivos em c

TRANSCRIPT

Slide 1

Unidade Didtica VIIIARQUIVOS: Conceituar e UtilizarARQUIVO :- um conjunto de registros logicamente organizados armazenados em um dispositivo de memria secundria (disco rgido, disquetes, fitas magnticas, cd, etc), onde cada registro compreende um conjunto de informaes denominadas campos. Em um arquivo possvel armazenar um volume grande de dados.

Arquivos - Introduo sistema de entrada e sada do ANSI C composto por uma srie de funes, cujos prottipos esto reunidos em stdio.h . Todas estas funes trabalham com o conceito de "ponteiro de arquivo". Podemos declarar um ponteiro de arquivo da seguinte maneira: FILE *p;p ser ento um ponteiro para um arquivo. Com este tipo de ponteiro que podemos manipular arquivos no C. Arquivos - IntroduoQuando se comea a execuo de um programa, o sistema automaticamente abre alguns arquivos pr-definidos: stdin: disp. de entrada padro (geralmente o teclado) stdout: disp. de sada padro (geralmente o vdeo) stderr: disp. sada de erro padro (geralmente o vdeo) stdaux: disp. sada auxiliar (p.e. porta serial) stdprn : disp. impresso padro (p.e. porta paralela) Arquivos - IntroduoCada uma destas constantes pode ser utilizada como um ponteiro para FILE, para acessar os perifricos associados a eles. Desta maneira, pode-se, por exemplo, usar:ch =getc(stdin);para efetuar a leitura de um caracter a partir do teclado, ou :putc(ch, stdout);para imprim-lo na tela.

Arquivos pr-definidosfopen( ) Abrir um arquivofclose( ) Fechar um arquivoputc( ) Escrever um caracter em um arquivogetc( ) Ler um caracter de um arquivofeof( ) Devolve verdadeiro se o fim do arquivo foi atingidoremove( ) Apagar um arquivofflush( ) Descarregar um arquivoFunes de Manipulao de ArquivosEstas funes esto no arquivo de cabealho stdio.h.Este cabealho define 3 tipos: size_t, fpos_t e FILE. Define tambm vrias macros, que para a manipulao de arquivos as mais importantes so:NULL: define um ponteiro nulo.EOF: geralmente definida como -1 e devolve este valor quando uma funo de entrada tenta ler alm do final do arquivo.FOPEN_MAX: define um valor inteiro que determina o nmero de arquivos que podem ser abertos ao mesmo tempo.SEEK_SET, SEEK_CUR e SEEK_END: so usadas com a funo fseek( ) para o acesso aleatrio a um arquivo.Funes de Manipulao de ArquivosfopenEsta a funo de abertura de arquivos. FILE *fopen (char *nome_do_arquivo, char *modo);O nome_do_arquivo determina qual arquivo dever ser aberto. Este nome deve ser vlido no sistema operacional que estiver sendo utilizado. O modo de abertura diz funo fopen() que tipo de uso voc vai fazer do arquivo. A tabela abaixo mostra os valores de modo vlidos: Funes de Manipulao de ArquivosModoSignificado"r" Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto."w Abrir um arquivo texto para gravao. Se o arquivo no existir, ele ser criado. Se j existir, o contedo anterior ser destrudo. "a" Abrir um arquivo texto para gravao. Os dados sero adicionados no fim do arquivo ("append"), se ele j existir; ou um novo arquivo ser criado, no caso de arquivo no existente anteriormente."rb" Abre um arquivo binrio para leitura. Igual ao modo "r" anterior, s que o arquivo binrio."wb" Cria um arquivo binrio para escrita, como no modo "w" anterior, s que o arquivo binrio."ab" Acrescenta dados binrios no fim do arquivo, como no modo "a" anterior, s que o arquivo binrio.Funes de Manipulao de ArquivosModoSignificado"r+" Abre um arquivo texto para leitura e gravao. O arquivo deve existir e pode ser modificado."w+ Cria um arquivo texto para leitura e gravao. Se o arquivo existir, o contedo anterior ser destrudo. Se no existir, ser criado."a+" Abre um arquivo texto para gravao e leitura. Os dados sero adicionados no fim do arquivo se ele j existir, ou um novo arquivo ser criado, no caso de arquivo no existente anteriormente."r+b" Abre um arquivo binrio para leitura e escrita. O mesmo que "r+" acima, s que o arquivo binrio."w+b Cria um arquivo binrio para leitura e escrita. O mesmo que "w+" acima, s que o arquivo binrio."a+b" Acrescenta dados ou cria uma arquivo binrio para leitura e escrita. O mesmo que "a+" acima, s que o arquivo binrioFunes de Manipulao de ArquivosPoderamos ento, para abrir um arquivo binrio para escrita: FILE *fp;/* Declarao da estrutura */fp=fopen ("exemplo.bin","wb"); /* o arquivo se chama exemplo.bin e est localizado no diretrio corrente */if (!fp) printf ("Erro na abertura do arquivo.");A condio !fp testa se o arquivo foi aberto com sucesso porque no caso de um erro a funo fopen() retorna um ponteiro nullo (NULL). Funes de Manipulao de ArquivosUma vez aberto um arquivo, podemos ler ou escrever nele utilizando as funes adequadas.Toda vez que estamos trabalhando com arquivos, h uma espcie de posio atual no arquivo. Esta a posio de onde ser lido ou onde ser escrito o prximo caractere. Normalmente, num acesso sequencial a um arquivo, no temos que mexer nesta posio pois quando lemos um caractere a posio no arquivo automaticamente atualizada. Num acesso randmico teremos que mexer nesta posio (ver fseek()). Funes de Manipulao de ArquivosfcloseQuando acabamos de usar um arquivo que abrimos, devemos fech-lo. int fclose (FILE *fp);O ponteiro fp passado funo fclose() determina o arquivo a ser fechado. Ela retorna 0 em caso de sucesso. Fechar um arquivo faz com que qualquer caracter que tenha permanecido no "buffer" associado ao fluxo de sada seja gravado. A funo exit() fecha todos os arquivos que um programa tiver aberto. Funes de Manipulao de ArquivosputcA funo putc uma funo de escrita de arquivo. Ela escreve um caractere no arquivo.int putc (int ch,FILE *fp);

O programa a seguir l uma string do teclado e escreve-a, caractere por caractere em um arquivo em disco (o arquivo arquivo.txt, que ser aberto no diretrio corrente). Funes de Manipulao de Arquivos#include #include int main(){FILE *fp;char string[100];int i;fp = fopen("arquivo1.txt","w"); //Arquivo ASCII, para escritaif(!fp) { //Testa se houve erro na abertura do arquivo => fp==nullprintf( "Erro na abertura do arquivo");exit(0); } //fecha todos os arquivosprintf("Entre com a string a ser gravada no arquivo:");gets(string);for(i=0; string[i]; i++) putc(string[i], fp); //Grava a string, caract. a caract.fclose(fp); //fecha o arquivo apontado por fpreturn 0;}getcRetorna um caractere lido do arquivo. int getc (FILE *fp);

feofEOF ("End of file") indica o fim de um arquivo. Para verificar se um arquivo chegou ao fim podemos usar a funo feof(): retorna no-zero se o ponteiro chegou ao fim do arquivo, caso contrrio retorna zero. int feof (FILE *fp);Funes de Manipulao de Arquivos#include #include int main(){ FILE *fp; char c; fp = fopen("arquivo.txt","r"); /* Arquivo ASCII, para leitura */ if(!fp) { printf( "Erro na abertura do arquivo"); exit(0); } while((c = getc(fp) ) != EOF) /* Enquanto no chegar ao final do arquivo */ printf("%c", c); /* imprime o caracter lido */ fclose(fp); return 0;}Exemplo com getc e EOF#include #include int main(){ FILE *fp; char c; fp = fopen("arquivo.txt","r"); /* Arquivo ASCII, para leitura */ if(!fp) { printf( "Erro na abertura do arquivo"); exit(0); } while(!feof(fp)) { /* Enquanto no chegar ao final do arquivo */ c = getc(fp); /* le o caractere */ printf("%c", c); /* imprime o caracter lido */ } fclose(fp); return 0;}Exemplo com getc e feoffgetsPara se ler uma string num arquivo podemos usar fgets(). char *fgets (char *str, int tamanho, FILE *fp);Argumentos: a string a ser lida, o limite mximo de caracteres a serem lidos e o ponteiro para FILE. A funo l a string at um caracter de nova linha ou tamanho-1 caracteres tenham sido lidos. A string resultante sempre terminar com '\0' (por isto somente tamanho-1 caracteres, no mximo, sero lidos).Funes de Manipulao de ArquivosfputsEscreve uma string num arquivo. char *fputs (char *str,FILE *fp);ferror() e perror()A funo retorna zero, se nenhum erro ocorreu e um nmero diferente de zero se algum erro ocorreu durante o acesso ao arquivo. int ferror (FILE *fp);

Funes de Manipulao de Arquivosferror(): verificar se cada acesso a um arquivo teve sucesso. Na maioria dos casos, se um arquivo pode ser aberto, ele pode ser lido ou gravado. Porm, existem situaes em que isto no ocorre. Por exemplo, pode acabar o espao em disco, etc. perror() (print error): cujo argumento uma string, indica em que parte do programa o problema ocorreu. fputs(string, pf);putc('\n', pf);if(ferror(pf)) perror("Erro na gravacao");Funes de Manipulao de Arquivos#include #include int main(){ FILE *fp; char string[100]; if((fp = fopen("arquivo.txt","w")) ==NULL) { printf("\nNao consigo abrir o arquivo ! "); exit(1); } do { printf("\nDigite uma nova string. Para terminar, digite : "); gets(string); fputs(string, fp); //Escreve a string no arquivo putc('\n', fp); //Pula uma linha no arquivo if(ferror(fp)) { //Testa se houve erro perror("Erro na gravacao"); //imprime o erro fclose(fp); exit(1); } } while (strlen(string) > 1); fclose(fp);}Exemplo com fputs, ferror e perror#include void main(){ FILE *fp; char Linha[100]; char *result; int i; // Abre um arquivo TEXTO para LEITURA fp = fopen("arquivo.txt", "r"); if (fp== NULL) { // Se houve erro na abertura printf("Problemas na abertura do arquivo\n"); return; } i = 1; while (!feof(fp)) {// L uma linha (inclusive com o '\n') result = fgets(Linha, 100, fp); // o 'fgets' l at 99 caracteres ou at o '\n' if (result) // Se foi possvel ler printf("Linha %d : %s",i,Linha); i++; } fclose(fp);}Exemplo com fgetsfread / fwritePodemos escrever e ler blocos de dados. Para tanto, temos as funes fread() e fwrite(). unsigned fread (void *buffer, int no_bytes, int count, FILE *fp);O buffer a regio de memria na qual sero armazenados os dados lidos. O nmero de bytes o tamanho da unidade a ser lida. count indica quantas unidades devem ser lidas. Funes de Manipulao de ArquivosA funo retorna o nmero de unidades efetivamente lidas. Este nmero pode ser menor que count quando o fim do arquivo for encontrado ou ocorrer algum erro. Quando o arquivo for aberto para dados binrios, fread pode ler qualquer tipo de dados.Funes de Manipulao de ArquivosfwriteA funo fwrite() funciona como a sua companheira fread(), porm escrevendo no arquivo.unsigned fwrite(void *buffer, int no_bytes, int count, FILE *fp);A funo retorna o nmero de itens escritos. Este valor ser igual a count a menos que ocorra algum erro.O exemplo a seguir ilustra o uso de fwrite e fread para gravar e posteriormente ler uma varivel float em um arquivo binrio.Funes de Manipulao de Arquivos#include #include int main(){ FILE *pf; float pi = 3.1415; float pilido; if((pf = fopen("arquivo.bin", "wb")) == NULL) /* Abre arq. bin. p/ escrita */ { printf("Erro na abertura do arquivo"); exit(1); } if(fwrite(&pi, sizeof(float), 1,pf) != 1) /* Escreve a varivel pi */ printf("Erro na escrita do arquivo"); fclose(pf); /* Fecha o arquivo */if((pf = fopen("arquivo.bin", "rb")) == NULL) /* Abre arq. p/ leitura */ { printf("Erro na abertura do arquivo"); exit(1); } if(fread(&pilido, sizeof(float), 1,pf) != 1) /* Le em pilido o valor da varivel armazenada anteriormente */ printf("Erro na leitura do arquivo"); printf("\nO valor de PI, lido do arquivo, e': %f", pilido); fclose(pf); return(0);}#include int main(){ FILE *arquivo; char nome[5]="samu"; int idade=34; float altura=1.82; if((arquivo = fopen("samu.dat","wb")) == NULL) { printf("Erro ao abrir arquivo!!!\n\n"); exit(1); } fwrite(&nome,sizeof(nome),1,arquivo); fwrite(&idade,sizeof(idade),1,arquivo); fwrite(&altura,sizeof(altura),1,arquivo); fclose(arquivo); return(0); }#include int main(){ FILE *arquivo; char nome[5]; int idade; float altura; if((arquivo = fopen("samu.dat","rb")) == NULL) { /* ERRO */ } fread(&nome,sizeof(nome),1,arquivo); fread(&idade,sizeof(idade),1,arquivo); fread(&altura,sizeof(altura),1,arquivo); printf("nome : %s\n",nome); printf("idade : %d\n",idade); printf("altura: %.2f\n",altura); fclose(arquivo); return(0); }fseekPara se fazer procuras e acessos randmicos em arquivos usa-se a funo fseek(). Esta move a posio corrente de leitura ou escrita no arquivo de um valor especificado, a partir de um ponto especificado. int fseek (FILE *fp, long numbytes, int origem);Funes de Manipulao de ArquivosO parmetro origem determina a partir de onde os numbytes de movimentao sero contados. Os valores possveis so definidos por macros em stdio.h e so:

Nome Valor SignificadoSEEK_SET 0 Incio do arquivoSEEK_CUR 1 Ponto corrente no arquivoSEEK_END 2 Fim do arquivo

Funes de Manipulao de Arquivos#includeintmain() { FILE * f; f = fopen("myfile.txt","w"); fputs("Hello World", f); fseek(f, 6, SEEK_SET); fputs(" India", f); fclose(f);return0;} // valor guardado no arquivo: Hello IndiaFunes de Manipulao de ArquivosrewindRetorna a posio corrente do arquivo para o incio. void rewind (FILE *fp);

removeApaga um arquivo especificado. int remove (char *nome_do_arquivo);

Funes de Manipulao de ArquivosfprintfA funo fprintf() funciona como a funo printf(). A diferena que a sada de fprintf() um arquivo e no a tela do computador. int fprintf (FILE *fp,char *str,...);fscanfA funo fscanf() funciona como a funo scanf(). A diferena que fscanf() l de um arquivo e no do teclado do computador. int fscanf (FILE *fp,char *str,...);

Funes de Manipulao de Arquivos#include #include int main(){ FILE *p; char str[80],c; printf("\n\n Entre com um nome para o arquivo:\n"); gets(str); if (!(p = fopen(str,"w"))) { /* ERRO */} fprintf(p,"Este e um arquivo chamado:\n%s\n", str); fclose(p); p = fopen(str,"r"); while (!feof(p)) { fscanf(p,"%c",&c); printf("%c",c); } fclose(p); return(0);}renamePara renomear um arquivo use a funo rename( ). int rename(NOME_ANTIGO, NOVO_NOME);onde NOME_ANTIGO e NOVO_NOME so ponteiros string. Se a funo for bem sucedida ela retornar zero, caso contrrio, retornar um valor diferente de zero.Esta mesma funo serve para mover um arquivo. Basta incluir a nova localizao como parte do NOVO_NOME do arquivo.Funes de Manipulao de Arquivos#include int main(int argc,char *argv[]){ if(argc != 3) { printf("Erro !!! \n"); printf("Sintaxe correta: renomear NOME_ANTIGO NOVO_NOME\n"); exit(1); } if(rename(argv[1],argv[2])) printf("Erro ao renomear arquivo!\n"); return(0);}Funes de Manipulao de Arquivosfopen( ) Abrir um arquivofclose( ) Fechar um arquivoputc( ) Escrever um caracter em um arquivofputc( ) Idem putc( )getc( ) Ler um caracter de um arquivofgetc( ) Idem getc( )fseek( ) Posicionar o ponteiro de arquivo num byte especficofprintf( ) para o arquivo o que printf para o consolefscanf( ) para o arquivo o que scanf para o consolefeof( ) Devolve verdadeiro se o fim do arquivo foi atingidoferror( ) Devolve verdadeiro se ocorreu um errorewind( ) Posicionar o ponteiro de arquivo no incio desteremove( ) Apagar um arquivofflush( ) Descarregar um arquivoFunes de Manipulao de ArquivosfflushPara esvaziar o contedo de uma stream aberta para sada use a funo fflush( ). fflush(ARQUIVO);sendo ARQUIVO um ponteiro de arquivo. Ela escreve o conteudo do buffer para o arquivo passado como argumento. Se for passado um valor nulo, todos os arquivos abertos para sada sero descarregados. Se tudo ocorrer bem fflush retornar zero, indicando sucesso. Caso contrrio, devolver EOF.Funes de Manipulao de Arquivos