15 Arquivos

Embed Size (px)

DESCRIPTION

Arquivo em C

Citation preview

  • Mtodos Computacionais

    Arquivos

  • 2Arquivos Um arquivo representa um elemento de informao armazenado em memria secundria (disco)

    Caractersticas:Informaes so persistidasAtribui-se nomes aos elementos de informao (arquivos e diretrios),em vez de endereos de memriaAcesso s informaes so mais lentos

  • 3Persistncia... pra qu?

    No perder os dados no fim da execuo de um programa

    Memria temporria(volatil)principalMais rpida e cara

    Memria permanentesecundriamais lenta e barata

    Para melhorar velocidade de acesso, a cada acesso, transfere-se trechos maiores do arquivo para espaos da memria (buffers)

    3

  • 4Modos de Acesso a Arquivos em C

    Dois modos de acesso:Texto e Binrio

    4

    Arquivo Texto:0 1 2 3 4

    Arquivo Binario:0 1 2 3 4

    Informao persistidaString

    Inteiros

  • 5Modo Texto interpretado como uma seqncia de caracteres agrupadas em linhasLinhas so separadas por um caractere de nova linha

    Vantagens:Pode ser lido facilmente por uma pessoaEditado por editores de texto convencionais

    DesvantagensCodificao dos caracteres pode variar (ASCII, UTF-8, ISSO-8859, etc)Arquivos tendem a ser maiores (todas os dados so convertidos para caracteres)

    5

  • 6Modo Binrio

    Dados so armazenados da mesma forma que so armazenados na memria principal

    Vantagens:Facilmente interpretados por programasMaior velocidade de manipulaoArquivos so, geralmente, mais compactos

    Desvantagens:Difcil de serem entendidos por pessoasDependentes da mquina onde foram gerados

    6

  • 7Operaes em Arquivos

    AberturaSistema Operacional (SO) encontra arquivo pelo nomePrepara buffer na memria

    LeituraSO recupera trecho solicitado do arquivoParte ou todo trecho pode vir do buffer

    7

  • 8Operaes em Arquivos

    EscritaSO altera contedo do arquivoAlterao feita primeiro no buffer para depois ser transferida para o disco

    FechamentoInformao do buffer atualizada no discorea do buffer utilizada na memria liberada

    8

  • 99

    Abertura de Arquivos em C

    Operaes de manipulao de arquivos em C se encontram, geralmente, na stdio.hFuno de Abertura

    NomeNome do arquivo

    FILETipo que representa uma abstrao do arquivo

    modor - Indica leituraw Indica escrita a Indica escrita ao final do existentet Indica modo textob Indica modo binrio

    FILE* fopen(char* nome,char* modo);

  • 10

    Abertura de Arquivos em C

    10

    SO mantm um cursor que indica a posio de trabalho no arquivoSe modo w e arquivo j existe

    Arquivo destrudo e um novo vazio criado

    Se modo w ou a e arquivo no existeUm novo arquivo criado

    No modo r, o arquivo j deve existirModos t e b podem ser combinados com os demais modosSe no for possvel a abertura, a funo retorna NULL

  • 11

    Exemplos de Abertura de Arquivos

    FILE *fp;fp = fopen(teste.txt, rt);

    fp = fopen(teste.bin, wb);

    fp = fopen(teste.txt, r+);

    fp = fopen(teste.txt, w+);

    Modo leitura e texto

    Modo escrita e binrio

    Modo leitura e escritaem arquivo existente

    Modo escrita e leituraem arquivo novo

    Modos t e b podem seromitidos

    11

  • 12

    Fechamento de Arquivos

    Aps leitura/escrita do arquivo, devemos fech-loFuno de fechamento

    Retorna 0 se o arquivo foi fechado com sucessoRetorna constante EOF se houve algum erro

    int fclose(FILE* fp);

    12

  • 13

    Leitura (Modo Texto)

    A cada operao de leitura, os dados correspondentes so transferidos para a memria e o cursor avana e aponta para o prximo dadoExiste em C a funo fscanf para ler dados de um arquivo modo texto

    Similar a scanfL de um arquivo passado como parmetro em vez de somente da entrada padro (teclado)Pode ler tambm da entrada padro (arquivo stdin)

    13

  • 14

    Leitura com fscanf

    Retorna nmero de dados lidos com sucessofp o ponteiro para o arquivoformato equivale aos cdigos de formatao (iguais aodo scanf)end_variaveis corresponde a lista de endereos de variveis que armazenaro os dados lidos do arquivo

    int fscanf(FILE* fp, char* formato,end_variaveis)

    14

  • 15

    Usando fscanf para Leitura (Modo Texto)

    15

    #include int main() {

    FILE *fp; char primeiraPalavra[121];fp = fopen(teste.txt,r);if (fp == NULL) {

    printf(Impossvel abrir arquivo);exit(1);

    }fscanf(fp, %120s,primeiraPalavra);printf(A primeira palavra do arquivo teste.txt

    : %s\n,primeiraPalavra);fclose(fp);

    return 0;}

    L uma string do arquivo apontado porfp de at 120 caracteres e armazena

    em primeiraPalavra

  • 1616

    Outras Funes de Leitura (Modo Texto)

    L um caractere de um arquivoRetorna o cdigo do caractere lidoRetorna EOF se fim do arquivo for alcanado

    s a cadeia de caracteres que armazenar o que for lidon o nmero mximo de caracteres a serem lidosL uma seqencia de caracteres at que \n seja encontrado ou que n caracteres tenham sido lidosRetorna ponteiro para a cadeia s

    int fgetc(FILE* fp);

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

  • 1717

    Usando fgetc para a Leitura

    #include int main() {FILE *fp; char c;int nCaracteres = 0, nLinhas = 0;fp = fopen(teste.txt,r);if (fp == NULL) {

    printf(Impossvel abrir arquivo);exit(1);

    }while ((c = fgetc(fp)) != EOF) {

    if (c == \n) nLinhas++;else nCaracteres++;

    }printf(Caracteres:%d,Linhas:%d\n,nCaracteres,nLinhas);fclose(fp); return 0;}

    Programa conta nmero de caracteres e conta o nmero de

    linhas de um arquivo

  • 1818

    int main() {FILE *fp;int nOcorrencias = 0; char palavra[121], linha [121];printf (Digite a palavra:\n);scanf( %120[^\n],palavra);fp = fopen(teste.txt,r);if (fp == NULL) {

    printf(Impossvel abrir arquivo);exit(1);

    }while (fgets(linha,121,fp) != NULL) {

    if (strstr(linha,palavra) != NULL) nOcorrencias++;

    }fclose(fp);printf(Ocorrncias de %s = %d\n, palavra,nOcorrencias);return 0;}

    Programa conta ocorrncias de uma palavra em um arquivo com linhas de no maximo 120 caracteres

    Usando fgets para a Leitura

    L uma linha e armazena em linha

    Utiliza funo strstr de string.h para saber se palavra substring de linha

  • 19

    Escrita (Modo Texto)

    A cada operao de escrita, os dados so gravados na memria e posteriormente no disco, e o cursor avana apontando para a proxima posio do arquivo:Existe em C a funo fprintf para escrever dados em um arquivo modo texto

    Similar a printfEscreve em um arquivo passado como parmetro em vez de somente na sada padro (monitor)Pode escrever tambm na sada padro (arquivo stdout)

    19

  • 20

    Leitura com fprintf

    Retorna nmero de dados escritos com sucessofp o ponteiro para o arquivoformato equivale aos cdigos de formatao (iguais aodo printf)variaveis corresponde a lista de variveis, cujoscontedos sero escritos no arquivo

    int fprintf(FILE* fp, char* formato,variaveis)

    20

  • 2121

    #include int main() {

    FILE *fp; char palavra[121];fp = fopen(teste.txt,w);if (fp == NULL) {

    printf(Impossvel abrir arquivo);exit(1);

    }printf (Digite a palavra:\n);scanf( %120[^\n],palavra);fprintf(fp,%s\n,palavra); fclose(fp);return 0;}

    Usando fprintf para Escrita (Modo Texto)

    Programa escreve uma palavra de no mximo 120 caracteres em um

    arquivo

  • 2222

    Outras Funes de Escrita (Modo Texto)

    Escreve um caractere de um arquivoRetorna o cdigo do caractere escritoRetorna EOF se fim do arquivo for alcanado

    s a cadeia de caracteres que ser escritaRetorna ponteiro para a cadeia s

    int fputc(FILE* fp, char c);

    char* fputs(char* s,FILE* fp);

  • 2323

    int main() {FILE *e; FILE *s;int caractere; char nome_entrada[121];printf (Digite o nome do arquivo de entrada:\n);scanf(%120s, nome_entrada);e = fopen(nome_entrada,r);if (e== NULL) {

    printf(Impossvel abrir arquivo de entrada);exit(1);}s = fopen(strcat(nome_entrada,_maiuscula),w);if (s== NULL) {

    printf(Impossvel abrir arquivo de saida);exit(1);}while ((caractere = fgetc(e)) != EOF)

    fputc(toupper(caractere),s);fputs(\nArquivo Convertido!,s);fclose(e); fclose(s);return 0;}

    Programa l um arquivo e gera outro com todas as letras convertidas para maiusculas

    Usando fputs e fputc para Escrita

    Usurio fornece o nomedo arquivo

    Converte caractere a caractere e escreve no

    arquivo

  • 24

    Leitura (Modo Binrio)

    p o endereo de memria em que vai ser armazenado o que for lidotam o tamanho em bytes de cada elemento lidonelem o nmero de elementos de tamanho tam lidos Retorna a quantidade de bytes lidos com sucesso (tam * nelem)

    int fread(void* p,int tam,int nelem,FILE* fp);

    24

  • 25

    Escrita (Modo Binrio)

    p o endereo de memria cujo contedo deseja-se salvar em arquivotam o tamanho em bytes de cada elemento escritonelem o nmero de elementos de tamanho tam escritos Retorna a quantidade de bytes escritos com sucesso (tam * nelem)

    int fwrite(void* p,int tam,int nelem,FILE* fp);

    25

  • 2626

    Usando fwrite na Escrita#include typedef struct ponto {

    float x,y;} Ponto;

    void salva (char* arquivo, int n, Ponto* vet) {FILE* fp = fopen(arquivo, wb);if (fp == NULL) {

    printf(Erro na abertura do arquivo.\n);exit(1);

    }fwrite(vet, sizeof(Ponto), n, fp);fclose(fp);

    } Funo que salva um vetor de pontos em um arquivo binrio

    Nmero de pontos do vetor

  • 27

    Usando fread na Leitura

    void carrega (char* arquivo, int n, Ponto* vet) {FILE* fp = fopen (arquivo, rb);if (fp == NULL) {

    printf(Erro na abetura do arquivo.\n);exit(1);

    }fread (vet, sizeof(Ponto), n, fp);fclose(fp);

    }

    Funo que recupera um vetor de pontos de um arquivo binrio

    27

  • 2828

    Usando as Funes Definidas Anteriormente

    int main() {Ponto *entrada, *saida; int nPontos, cont,pos ;FILE *arquivo;char nome_arquivo[121];printf(Digite o nome do arquivo:\n);scanf(%120s,nome_arquivo);printf(\nDigite o nmero de pontos:\n);scanf(%d,&nPontos);entrada = (Ponto *) malloc(nPontos*sizeof(Ponto));for (cont = 0; cont < nPontos;cont++) {

    printf(Digite coordenadas x,y:\n);scanf(%f%f,&entrada[cont].x,&entrada[cont].y);

    }/* continua */ Programa que salva e recupera um vetor de

    pontos em um arquivo binrio

  • 2929

    salva(nome_arquivo, nPontos, entrada);do {

    printf(Digite agora a posio do ponto que deseja ver: \n);

    scanf(%d,&pos);} while (pos > nPontos || pos

  • 30

    Funes Utilitrias

    Retorna a posio atual do cursor do arquivoCorresponde a distancia em bytes em relao ao comeo do arquivo

    long ftell(FILE* fp);

    Devem ser utilizadas com cautela em arquivos no modo texto, pois nem sempre o posicionamento do cursor vai ser o desejado

    Certas plataformas podem colocar caracteres de formatao no visveis que podem alterar o tamanho do arquivo (nmero de bytes)

    30

  • 31

    Funes Utilitrias

    Utilizada para posicionamento do cursor em um arquivodist o nmero de bytes em relao a origemorigem uma posio do cursor do arquivo em bytes (SEEK_CUR posio corrente; SEEK_SET incio do arquivo; SEEK_END final do arquivo)Retorna a nova posio do cursor

    long fseek(FILE* fp,long dist,int origem);

    31

  • 3232

    Funes Utilitrias

    Ponto le_ponto (FILE* fp, int i) {Ponto p;fseek (fp, i*sizeof(Ponto), SEEK_SET);fread(&p, sizeof(Ponto), 1, fp);return p;

    }

    int tamanho_arquivo (FILE *fp) { int tamanho; fseek (fp, 0, SEEK_END);tamanho =ftell (fp); return tamanho;

    }

    Funo que recupera o i-simo ponto armazenado em um arquivo

    Funo que retorna o tamanho do arquivo em bytes

    Mtodos ComputacionaisArquivosPersistncia... pra qu?Modos de Acesso a Arquivos em CModo TextoModo BinrioOperaes em ArquivosOperaes em ArquivosAbertura de Arquivos em CAbertura de Arquivos em CExemplos de Abertura de ArquivosFechamento de ArquivosLeitura (Modo Texto)Leitura com fscanfUsando fscanf para Leitura (Modo Texto)Outras Funes de Leitura (Modo Texto)Usando fgetc para a LeituraEscrita (Modo Texto)Leitura com fprintfOutras Funes de Escrita (Modo Texto)Leitura (Modo Binrio)Escrita (Modo Binrio)Usando fwrite na EscritaUsando as Funes Definidas AnteriormenteFunes UtilitriasFunes UtilitriasFunes Utilitrias