TRATAMENTO DE ARQUIVOS EM C

19
TRATAMENTO DE TRATAMENTO DE ARQUIVOS EM C ARQUIVOS EM C Prof. Rosana Palazon Prof. Rosana Palazon

description

TRATAMENTO DE ARQUIVOS EM C. Prof. Rosana Palazon. Conceitos Básicos (cont.). Um arquivo em disco consiste em um conjunto de informações que são mantidas na memória secundária. - PowerPoint PPT Presentation

Transcript of TRATAMENTO DE ARQUIVOS EM C

Page 1: TRATAMENTO DE ARQUIVOS EM  C

TRATAMENTO DE TRATAMENTO DE ARQUIVOS EM CARQUIVOS EM C

Prof. Rosana PalazonProf. Rosana Palazon

Page 2: TRATAMENTO DE ARQUIVOS EM  C

Conceitos Básicos (cont.)Conceitos Básicos (cont.)

Um arquivo em disco consiste em um Um arquivo em disco consiste em um conjunto de informações que são mantidas conjunto de informações que são mantidas na memória secundária.na memória secundária.

Comparando-se memória principal (RAM) e Comparando-se memória principal (RAM) e memória secundária (discos), os aspectos memória secundária (discos), os aspectos mais relevantes são eficiência e mais relevantes são eficiência e persistência. persistência.

Para contornar os problemas decorrentes da Para contornar os problemas decorrentes da eficiência o sistema operacional “bufferiza” eficiência o sistema operacional “bufferiza” as informações lidas/gravadas em disco.as informações lidas/gravadas em disco.

Page 3: TRATAMENTO DE ARQUIVOS EM  C

Conceitos Básicos(cont.)Conceitos Básicos(cont.)

Em C os arquivos podem ser vistos/tratados Em C os arquivos podem ser vistos/tratados de 2 maneiras: em modo texto (uma de 2 maneiras: em modo texto (uma sequência de caracteres) ou binário(uma sequência de caracteres) ou binário(uma sequência de bytes).sequência de bytes).

Um arquivo tipo texto pode ser Um arquivo tipo texto pode ser lido/tratado por qualquer editor de textos lido/tratado por qualquer editor de textos (bloco de notas, Word, Dev C++)(bloco de notas, Word, Dev C++)

Um arquivo binário pode manipular Um arquivo binário pode manipular grandes quantidades de informação de grandes quantidades de informação de modo mais eficientemodo mais eficiente

Page 4: TRATAMENTO DE ARQUIVOS EM  C

Conceitos Básicos (cont.)Conceitos Básicos (cont.) Para qualquer um dos tipos, o sistema Para qualquer um dos tipos, o sistema

operacional disponibiliza um conjunto de operacional disponibiliza um conjunto de serviços necessários à manipulação de serviços necessários à manipulação de arquivos:arquivos:• Abertura do arquivo (localização, alocação de Abertura do arquivo (localização, alocação de

buffer)buffer)• Leitura (disponibilização das informações do Leitura (disponibilização das informações do

buffer para o programa)buffer para o programa)• Gravação (alteração de dados preexistentes ou Gravação (alteração de dados preexistentes ou

acréscimo de novas informações)acréscimo de novas informações)• Fechamento do arquivo (atualização das Fechamento do arquivo (atualização das

informações mantidas no buffer e liberação da informações mantidas no buffer e liberação da área de memória utilizada)área de memória utilizada)

Page 5: TRATAMENTO DE ARQUIVOS EM  C

A função básica para abertura de um arquivo é:A função básica para abertura de um arquivo é: FILE *fopen (char* nome_arquivo, char* modo)FILE *fopen (char* nome_arquivo, char* modo)

nome_arquivonome_arquivo – nome completo do arquivo incluindo – nome completo do arquivo incluindo diretório/subdiretório/nome.extensãodiretório/subdiretório/nome.extensão

modo :modo : r r readread Modo leitura (O arquivo precisa existir) Modo leitura (O arquivo precisa existir) w w writewrite Modo gravação (Gera um novo arquivo) Modo gravação (Gera um novo arquivo) a a appendappend Modo gravação no final do arquivo Modo gravação no final do arquivo (Adiciona num arquivo existente ou(Adiciona num arquivo existente ou

gera um novo) gera um novo) t t texttext Modo texto Modo texto b b binarybinary Modo binário Modo binário++ modificador dos modos r , w e a (r+, w+ e a+) modificador dos modos r , w e a (r+, w+ e a+)

Função para abertura de arquivos Função para abertura de arquivos

Page 6: TRATAMENTO DE ARQUIVOS EM  C

Função para abertura de arquivos (cont.) Função para abertura de arquivos (cont.) EXEMPLOS:EXEMPLOS:

FILE *fp;FILE *fp;fp = fopen(“entrada.txt”,”rt”);fp = fopen(“entrada.txt”,”rt”);

if (fp==NULL) {if (fp==NULL) { printf(“Erro na abertura do arquivo.\n”);printf(“Erro na abertura do arquivo.\n”); exit(1); //aborta o programaexit(1); //aborta o programa } } //abre o arquivo de texto entrada.txt para leitura//abre o arquivo de texto entrada.txt para leitura

FILE *arq;FILE *arq;arq = fopen(“saida.txt”,”wt”);arq = fopen(“saida.txt”,”wt”);

if (arq==NULL) {if (arq==NULL) { printf(“Erro na abertura do arquivo.\n”);printf(“Erro na abertura do arquivo.\n”); exit(1); //aborta o programaexit(1); //aborta o programa }}//abre o arquivo de texto saida.txt para gravação//abre o arquivo de texto saida.txt para gravação

Page 7: TRATAMENTO DE ARQUIVOS EM  C

Função para fechamento de arquivos Função para fechamento de arquivos

int fclose (FILE *fp);int fclose (FILE *fp);

O valor de retorno é NULL se o arquivo O valor de retorno é NULL se o arquivo for fechado com sucesso ou a for fechado com sucesso ou a constante EOF (definida pela constante EOF (definida pela biblioteca) indicando a ocorrência de biblioteca) indicando a ocorrência de erro.erro.

EXEMPLOS:EXEMPLOS:

fclose(fp);fclose(fp);

fclose(arq);fclose(arq);

Page 8: TRATAMENTO DE ARQUIVOS EM  C

Funções para leitura de arquivos em Funções para leitura de arquivos em modo texto modo texto

int fscanf(FILE *fp, char* formato,...);int fscanf(FILE *fp, char* formato,...);Semelhante ao Semelhante ao scanfscanf, especifica, além do ponteiro para o , especifica, além do ponteiro para o arquivo, o formato dos dados a serem lidos. Retorna o arquivo, o formato dos dados a serem lidos. Retorna o número de informações lidasnúmero de informações lidas

int fgetc(FILE *fp);int fgetc(FILE *fp);Esta função captura os dados caractere a caractere, até o Esta função captura os dados caractere a caractere, até o final do arquivo (EOF). final do arquivo (EOF).

char fgets(char* s, int n, FILE *fp);char fgets(char* s, int n, FILE *fp); Lê a partir do arquivo uma seqüência de caracteres, até Lê a partir do arquivo uma seqüência de caracteres, até

que um ‘\n’ seja encontrado.que um ‘\n’ seja encontrado. int nint n deve ser especificado de tal modo que acomode o deve ser especificado de tal modo que acomode o

finalizador de string ‘\0’. Retorna NULL se não leu nada.finalizador de string ‘\0’. Retorna NULL se não leu nada.

Page 9: TRATAMENTO DE ARQUIVOS EM  C

int fgetc(FILE *fp);int fgetc(FILE *fp);

EXEMPLO:EXEMPLO:/*conta o numero de linhas de um arquivo*//*conta o numero de linhas de um arquivo*/#include <stdio.h>#include <stdio.h>iint main () {nt main () { int c,nlinhas=0;int c,nlinhas=0; FILE *arq;FILE *arq; arq=fopen(“entrada.txt”, “rt”); arq=fopen(“entrada.txt”, “rt”); //abre o arquivo//abre o arquivo if (arq==NULL) {if (arq==NULL) { printf(“Não foi possível abrir o arquivo.\n”);printf(“Não foi possível abrir o arquivo.\n”); exit(1);exit(1); }} while((c=fgetc(arq))!=EOF) {while((c=fgetc(arq))!=EOF) { if(c==‘\n’) nlinhas++;if(c==‘\n’) nlinhas++; }} fclose(arq); fclose(arq); //fecha o arquivo//fecha o arquivo printf(“Numero de linhas = %d\n”, nlinhas); printf(“Numero de linhas = %d\n”, nlinhas); /* exibe o resultado na /* exibe o resultado na

tela */tela */return 0;return 0;}}

Funções para leitura de arquivos - exemplosFunções para leitura de arquivos - exemplos

Page 10: TRATAMENTO DE ARQUIVOS EM  C

int fscanf(FILE *fp, char* formato, ...);int fscanf(FILE *fp, char* formato, ...);

EXEMPLO:EXEMPLO:/*conta o numero de linhas de um arquivo*//*conta o numero de linhas de um arquivo*/#include <stdio.h>#include <stdio.h>int main () {int main () { int nl=0; char c;int nl=0; char c; FILE *arq;FILE *arq; arq=fopen(“entrada.txt”, “rt”); arq=fopen(“entrada.txt”, “rt”); //abre o arquivo//abre o arquivo if (arq==NULL) {if (arq==NULL) { printf(“Não foi possível abrir o arquivo.\n”);printf(“Não foi possível abrir o arquivo.\n”); exit(1);exit(1); }} while(fscanf(arq,”%c”,&c)==1) {while(fscanf(arq,”%c”,&c)==1) { if(c==‘\n’) nl++;if(c==‘\n’) nl++; }} fclose(arq); fclose(arq); //fecha o arquivo//fecha o arquivo printf(“Numero de linhas = %d\n”, nl); printf(“Numero de linhas = %d\n”, nl); /* exibe o resultado na tela /* exibe o resultado na tela

*/*/ return 0;return 0;}}

Funções para leitura de arquivos -exemplosFunções para leitura de arquivos -exemplos

Page 11: TRATAMENTO DE ARQUIVOS EM  C

Funções para leitura de arquivos -exemplos Funções para leitura de arquivos -exemplos

char fgets(char* s, int n, FILE *fp);char fgets(char* s, int n, FILE *fp);EXEMPLO:EXEMPLO:

/*mostra linhas de arquivo de texto*//*mostra linhas de arquivo de texto*/#include <stdio.h>#include <stdio.h>int main () {int main () { char c[41];char c[41]; FILE *arq;FILE *arq; arq=fopen("entrada.txt", "rt"); arq=fopen("entrada.txt", "rt"); //abre o arquivo//abre o arquivo if (arq==NULL) {if (arq==NULL) { printf("Não foi possível abrir o arquivo.\n");printf("Não foi possível abrir o arquivo.\n"); system("pause");system("pause"); exit(1);exit(1); }} while(fgets(c, 40, arq)!= NULL) {while(fgets(c, 40, arq)!= NULL) { printf("%s",c); printf("%s",c); // ou puts(c);// ou puts(c); }} fclose(arq); fclose(arq); //fecha o arquivo//fecha o arquivo}}

Page 12: TRATAMENTO DE ARQUIVOS EM  C

Funções para gravação de arquivos de Funções para gravação de arquivos de modo textomodo texto

int fprintf( FILE* fp, char* formato, ...);int fprintf( FILE* fp, char* formato, ...);Análoga à função printf grava as informações Análoga à função printf grava as informações especificadas no arquivoespecificadas no arquivo

int fputc(int c, FILE* fp);int fputc(int c, FILE* fp);Análoga à função putc grava no arquivo Análoga à função putc grava no arquivo especificado a informação caractere a caractere.especificado a informação caractere a caractere.

char* fputs(char* s, FILE* fp);char* fputs(char* s, FILE* fp);Análoga à função puts grava no arquivo Análoga à função puts grava no arquivo especificado a informação string a string.especificado a informação string a string.

Page 13: TRATAMENTO DE ARQUIVOS EM  C

Funções para gravação de arquivos -exemplosFunções para gravação de arquivos -exemplos

int fprintf( FILE* fp, char* formato, ...);int fprintf( FILE* fp, char* formato, ...);Exemplo:Exemplo:#include <stdio.h>#include <stdio.h>//grava a frase no arquivo tipo texto//grava a frase no arquivo tipo textoint main(){int main(){ FILE *fp;FILE *fp; char frase[]="Fatec Sao Caetano";char frase[]="Fatec Sao Caetano"; fp=fopen("saida.txt","wt");fp=fopen("saida.txt","wt"); for(int i=0; frase[i]!='\0';i++)for(int i=0; frase[i]!='\0';i++) fprintf(fp,"%c",frase[i]);fprintf(fp,"%c",frase[i]); fclose(fp);fclose(fp); printf("arquivo gravado\n");printf("arquivo gravado\n"); system("pause");system("pause"); return 0;return 0;}}

Page 14: TRATAMENTO DE ARQUIVOS EM  C

Funções para gravação de arquivos -exemplosFunções para gravação de arquivos -exemplosint fputc( int c, FILE* fp);int fputc( int c, FILE* fp);

Exemplo:Exemplo:#include <stdio.h>#include <stdio.h>int main(){int main(){ FILE *arq;FILE *arq; char frase[]="Fatec Sao Caetano e dez!";char frase[]="Fatec Sao Caetano e dez!"; arq=fopen("saida2.txt","wt");arq=fopen("saida2.txt","wt"); for(int i=0; frase[i]!='\0';i++)for(int i=0; frase[i]!='\0';i++) fputc(frase[i],arq);fputc(frase[i],arq); fclose(arq);fclose(arq); return 0;return 0;}}

Page 15: TRATAMENTO DE ARQUIVOS EM  C

Funções para gravação de arquivos -exemplosFunções para gravação de arquivos -exemplos

char* fputs( char* s, FILE* fp);char* fputs( char* s, FILE* fp);Exemplo:Exemplo:#include <stdio.h>#include <stdio.h>

int main(){int main(){ FILE *fp;FILE *fp; char frase[]="Programação Avançada";char frase[]="Programação Avançada"; char endline='\n';char endline='\n'; fp=fopen("saida3.txt","wt");fp=fopen("saida3.txt","wt"); fputs(frase,fp);fputs(frase,fp); fputc(endline,fp);fputc(endline,fp); fputs(frase,fp);fputs(frase,fp); fclose(fp);fclose(fp); return 0;return 0;}}

Page 16: TRATAMENTO DE ARQUIVOS EM  C

Arquivos em modo BinárioArquivos em modo Binário

Servem para salvar(recuperar) as Servem para salvar(recuperar) as informações tais como se encontram informações tais como se encontram na memória principal;na memória principal;

A vantagem neste tipo de utilização é A vantagem neste tipo de utilização é o manuseio de grandes quantidades o manuseio de grandes quantidades de dados de forma mais eficiente. de dados de forma mais eficiente.

Um arquivo gravado em binário Um arquivo gravado em binário permite ainda a recuperação permite ainda a recuperação randômica de parte da informação randômica de parte da informação ((fseekfseek))

Page 17: TRATAMENTO DE ARQUIVOS EM  C

Arquivos em modo BinárioArquivos em modo BinárioFunção para leitura:Função para leitura:int fread (void* p, int tam, int num, FILE *fp);int fread (void* p, int tam, int num, FILE *fp); onde:onde:

void* pvoid* p é o endereço de memória que contém a é o endereço de memória que contém a informação a ser gravadainformação a ser gravadaint tam int tam é o tamanho em bytes de cada elemento é o tamanho em bytes de cada elemento

int numint num é o número de elementosé o número de elementosFILE *fpFILE *fp é o ponteiro para o arquivo é o ponteiro para o arquivo

Função para gravação:Função para gravação:int fwrite (void* p, int tam, int num, FILE *fp);int fwrite (void* p, int tam, int num, FILE *fp);

Função para posicionamento:Função para posicionamento:int fseek (FILE *fp, long offset, int origem);int fseek (FILE *fp, long offset, int origem);

Page 18: TRATAMENTO DE ARQUIVOS EM  C

Arquivos em modo Binário – Exemplo 1Arquivos em modo Binário – Exemplo 1#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <string.h>#include <string.h>typedef struct {typedef struct { int num; int num; char nome[10];char nome[10]; float nota;float nota; }aluno; }aluno; int main(){int main(){ FILE *fp;FILE *fp; aluno a,b; aluno a,b; a.num=100;a.num=100; strcpy(a.nome, "Aluno");strcpy(a.nome, "Aluno"); a.nota=9.5;a.nota=9.5; fp=fopen("saidaBin.bin","wb");fp=fopen("saidaBin.bin","wb");//gravação binario//gravação binario fwrite(&a, sizeof(aluno),1,fp);fwrite(&a, sizeof(aluno),1,fp); fclose(fp);fclose(fp); fp=fopen("saidaBin.bin","rb");fp=fopen("saidaBin.bin","rb");//leitura binário//leitura binário fread(&b, sizeof(aluno),1,fp);fread(&b, sizeof(aluno),1,fp); printf("\nDados gravados:\nNum: %d, Nome: %s, Nota= %.1f\n\printf("\nDados gravados:\nNum: %d, Nome: %s, Nota= %.1f\n\

n",b.num,b.nome,b.nota); n",b.num,b.nome,b.nota); system("pause");system("pause"); return 0;return 0;}}

Page 19: TRATAMENTO DE ARQUIVOS EM  C

Arquivos em modo Binário – Exemplo 2Arquivos em modo Binário – Exemplo 2#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>//uso do fseek//uso do fseek

int main(){int main(){ FILE *fp;FILE *fp; int num[20];int num[20]; int vet[5];int vet[5]; for(int i=0;i<20;i++)for(int i=0;i<20;i++) num[i]=i;num[i]=i; fp=fopen("vetBin.bin","wb");fp=fopen("vetBin.bin","wb");//gravação binario (gera novo arq)//gravação binario (gera novo arq) fwrite(num, sizeof(int),20,fp);fwrite(num, sizeof(int),20,fp); fclose(fp);fclose(fp); fp=fopen("vetBin.bin","rb");fp=fopen("vetBin.bin","rb"); fseek(fp,-5*sizeof(int),SEEK_END); fseek(fp,-5*sizeof(int),SEEK_END); //SEEK_CUR ou SEEK_SET//SEEK_CUR ou SEEK_SET fread(vet, sizeof(int),5,fp);fread(vet, sizeof(int),5,fp); printf("\nVetor resultante\n");printf("\nVetor resultante\n"); for(int i=0; i<5;i++)for(int i=0; i<5;i++) printf("%d\t",vet[i]);printf("%d\t",vet[i]); printf("\n\n"); printf("\n\n"); system("pause");system("pause"); return 0;return 0;}}