Baixe o app para aproveitar ainda mais
Prévia do material em texto
Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica COMPUTAÇÃO BÁSICA Manipulação de Arquivos Prof. Bruno Macchiavello (bruno@cic.unb.br) Universidade de Brasília – UnB Instituto de Ciências Exatas – IE Departamento de Ciência da Computação – CIC Prof. Bruno Macchiavello 1 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Arquivos Binarios • ARQUIVOS BINÁRIOS: São arquivos versáteis, pois possuem maior facilidade de leitura e escrita, pois podemos gravar estruturas inteiras de uma vez, como vetores por exemplo, e acessá-los facilmente, ao contrário dos arquivosacessá-los facilmente, ao contrário dos arquivos TEXTO que temos que escrever (e ler) dado por dado. • Em arquivos binários normalmente são usadas as funções fwrite() para escrever e fread() para ler. Prof. Bruno Macchiavello 2 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Arquivos Binarios • ARQUIVOS BINÁRIOS fwrite(&nome_da_variavel, sizeof(tipo_variavel), qtde a ser gravada, FILE *fp) /*a função sizeof retorna o tamanho em bytes do tipo da /*a função sizeof retorna o tamanho em bytes do tipo da variavel*/ fread (&nome_da_variavel, sizeof(tipo_variavel), qtde a ser lida, FILE *fp) • A variável, no caso da função fwrite é a variável onde o dado a ser gravado se encontra e que será passado para o arquivo. No caso da função fread é a variável que irá receber o valor que será lido do arquivo. Prof. Bruno Macchiavello 3 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo: um programa que escreve a string “Meu primeiro programa com arquivo binário” em um arquivo, em seguida lê a mesma (do arquivo) e mostra seu conteúdo na tela: #include <stdio.h> #include <string.h> int main (){ FILE *fp; char string[50]; char nomeArquivo[50]; strcpy(nomeArquivo, "arquivoBinario.bin"); if (fopen(nomeArquivo, "a+b") == NULL) { fp = fopen(nomeArquivo, "wb"); } else { Prof. Bruno Macchiavello 4 } else { fp = fopen(nomeArquivo, "a+b"); } strcpy(string,"Meu primeiro programa com arquivo binario"); fwrite(string, sizeof(string),1,fp); fclose(fp); fp = fopen(nomeArquivo,"a+b"); strcpy(string," "); fread(string, sizeof(string),1,fp); printf("\nVeja o conteudo da string lida do arquivo: "); printf("\n%s ", string); getchar(); fclose(fp); return 0; } Note que foi possível escrever toda a string sem o WHILE. Isso foi possivel pois foi guardada no arquivo a estrutura binária da string. Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo: um programa que escreve uma STRUCT em um arquivo, e depois lê esta informação do arquivo e mostra na tela. Neste exemplo são lidas e gravadas informações (código e nome) para 3 pessoas. #include <stdio.h> typedef struct { int codigo; char nome[30]; } tipoDadosPessoa; int main() { FILE *fp; Prof. Bruno Macchiavello 5 FILE *fp; tipoDadosPessoa dadosDePessoa; int i; char nomeArquivo[50]; strcpy(nomeArquivo, "arqbin.bin"); if (fopen(nomeArquivo, "a+b") == NULL) { fp = fopen(nomeArquivo, "wb"); } else { fp = fopen(nomeArquivo, "a+b"); } /* CONTINUA NO PRÓXIMO SLIDE */ Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica /* CONTINUAÇÃO DO SLIDE ANTERIOR */ for (i = 0; i<3; i++ ) { printf("Informe o nome: "); scanf("%s", dadosDePessoa.nome); printf("Informe o cod: "); scanf("%d", &dadosDePessoa.codigo); fwrite(&dadosDePessoa,sizeof(tipoDadosPessoa),1,fp); } Lê um registro e grava no arquivo. Prof. Bruno Macchiavello 6 } fclose(fp); fopen(nomeArquivo,"a+b"); while (fread(&dadosDePessoa, sizeof(tipoDadosPessoa),1,fp) != 0) { printf("\n\nNome: %s",dadosDePessoa.nome); printf("\nCod: %d",dadosDePessoa.codigo); getchar(); } fclose(fp); } Lê um registro de cada vez do arquivo. O loop encerra quando a função fread retornar 0 (zero) caracteres lidos, ou seja, quando chegar no fim do arquivo. Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo: um programa que escreve um vetor de STRUCT (registros) um arquivo, e depois lê esta informação do arquivo e mostra na tela. Neste exemplo são lidas e gravadas informações (código e nome) para 3 pessoas. #include <stdio.h> typedef struct { int codigo; char nome[30]; } tipoDadosDeFuncionario; int main() { FILE *fp; Prof. Bruno Macchiavello 7 FILE *fp; tipoDadosDeFuncionario dadosDeFuncionario[3], dadoslidos[3]; int i; char nomeArquivo[50]; strcpy(nomeArquivo, "arqbin1.bin"); if (fopen(nomeArquivo, "a+b") == NULL) { fp = fopen(nomeArquivo, "wb"); } else { fp = fopen(nomeArquivo, "a+b"); } /* CONTINUA NO PRÓXIMO SLIDE */ Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica /* CONTINUAÇÃO DO SLIDE ANTERIOR*/ for (i = 0; i<3; i++ ) { printf("Informe o nome: "); scanf("%s", dadosDeFuncionario[i].nome); printf("Informe o cod: "); scanf("%d", &dadosDeFuncionario[i].codigo); } fwrite(dadosDeFuncionario,sizeof(tipoDadosDeFuncionario),3,fp); Grava no arquivo de uma vez só todo o vetor com 3 registros. Prof. Bruno Macchiavello 8 fwrite(dadosDeFuncionario,sizeof(tipoDadosDeFuncionario),3,fp); fclose(fp); fp = fopen(nomeArquivo,"a+b"); fread(&dadoslidos, sizeof(tipoDadosDeFuncionario),3,fp); for (i = 0; i<3; i++ ) { printf("\n\nNome: %s",dadoslidos[i].nome); printf("\nCod: %d",dadoslidos[i].codigo); getchar(); getchar(); } } Lê 3 registros de uma vez do arquivo, e grava direto os 3 no vetor dadoslidos. Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Arquivo Binário • Note que temos a facilidade na manipulação de arquivos binários • Para fazer isto com arquivo de texto seria mais• Para fazer isto com arquivo de texto seria mais complexo. • Porém tente abrir o arquivoBinario.bin no notepad e veja que não conseguimos lê-lo facilmente! Prof. Bruno Macchiavello 9 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Arquivos • ATENÇÃO: • Toda vez que estamos trabalhando com arquivos, há uma espécie de posição atual no stream. Esta é a posição de onde será lido oustream. Esta é a posição de onde será lido ou escrito o próximo caractere. Normalmente, num acesso seqüencial a um arquivo, não temos que mexer nesta posição pois quando lemos um caractere a posição no arquivo é automaticamente atualizada. Num acesso randômico teremos que mexer nesta posição. Prof. Bruno Macchiavello 10 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica FSEEK() • fseek(): para se fazer procuras e acessos randômicos em arquivos usa-se a função fseek(). Esta move a posição corrente de leitura ou escrita no arquivo de um valor especificado, a partir de um ponto especificado.fseek (FILE *fp, deslocamento em bytes,origem); fseek (FILE *fp, deslocamento em bytes,origem); � O parâmetro origem determina a partir de onde os deslocamento em bytes de movimentação serão contados. Os valores possíveis são definidos por macros em stdio.h e são: o SEEK_SET = 0 = Início do arquivo o SEEK_CUR = 1 = Ponto corrente no arquivo o SEEK_END = 2 = Fim do arquivo � Tendo-se definido a partir de onde irá se contar, deslocamento em bytes determina quantos bytes de deslocamento serão dados na posição atual. Prof. Bruno Macchiavello 11 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exemplo: um programa que escreve um vetor de STRUCT (registros) um arquivo com informações (código e nome) para 5 pessoas. Depois o programa acessa, lê, e mostra o terceiro registro gravado no arquivo. #include <stdio.h> typedef struct { int codigo; char nome[30]; } tipoDadosDeFuncionario; int main() { FILE *fp; Prof. Bruno Macchiavello 12 FILE *fp; tipoDadosDeFuncionario dadosDeFuncionario[5], dadoslidos; int i; char nomeArquivo[50]; strcpy(nomeArquivo, "arqbin1.bin"); if (fopen(nomeArquivo, "a+b") == NULL) { fp = fopen(nomeArquivo, "wb"); } else { fp = fopen(nomeArquivo, "a+b"); } /* CONTINUA NO PRÓXIMO SLIDE */ Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica /* CONTINUAÇÃO DO SLIDE ANTERIOR*/ for (i = 0; i<5; i++ ) { printf("Informe o nome: "); scanf("%s", dadosDeFuncionario[i].nome); printf("Informe o cod: "); scanf("%d", &dadosDeFuncionario[i].codigo); } fwrite(&dadosDeFuncionario,sizeof(tipoDadosDeFuncionario),5,fp); fclose(fp); Posiciona o ponteiro do arquivo Grava no arquivo de uma vez só todo o vetor com 5 registros. Prof. Bruno Macchiavello 13 fclose(fp); fopen(nomeArquivo,"a+b"); fseek (fp,(sizeof(tipoDadosDeFuncionario)*2),0); fread(&dadoslidos, sizeof(tipoDadosDeFuncionario),1,fp); printf("\n\nNome: %s",dadoslidos.nome); printf("\nCod: %d",dadoslidos.codigo); getchar(); getchar(); } Posiciona o ponteiro do arquivo no início do 3o registro. Lê um registro a partir da posição onde o ponteiro se encontra, no caso o 3o registro. Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fopen Protótipo: FILE *fopen (char *nome_do_arquivo,char *modo); • O primeiro parâmetro "nome_do_arquivo": é o local onde o arquivo se encontra ou se for criado, onde o arquivo deve ser armazenado. • O segundo parâmetro "*modo": especifica como o arquivo deve ser aberto. Abaixo uma tabela mostrando os modos possíveis: Prof. Bruno Macchiavello 14 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fclose Protótipo: int fclose (FILE *fp); • O ponteiro fp passado à função fclose() • O ponteiro fp passado à função fclose() determina o arquivo a ser fechado. A função retorna zero no caso de sucesso. Prof. Bruno Macchiavello 15 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • putc ou fputc Escreve um caractere no arquivo. Protótipo: int putc (int ch,FILE *fp);Protótipo: int putc (int ch,FILE *fp); • Parâmetro 1: "int ch" - caracter a ser escrito no arquivo (pode ser uma variável). • Parâmetro 2: "FILE *fp" - o arquivo a ser escrito. Prof. Bruno Macchiavello 16 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • getc ou fgetc Retorna um caractere lido do arquivo. Protótipo: int getc (FILE *fp);Protótipo: int getc (FILE *fp); • Parâmetro: "FILE *fp" - o arquivo a ser lido. Prof. Bruno Macchiavello 17 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • feof 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(). Ela retorna não-zero se o arquivo chegou feof(). Ela retorna não-zero se o arquivo chegou ao EOF, caso contrário retorna zero. Protótipo: int feof (FILE *fp); • Parâmetro: "FILE *fp" - o arquivo a ser verificado. Prof. Bruno Macchiavello 18 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fprintf Escreve uma constante de caracteres em um arquivo, essa função funciona como printf, sendo que a diferença é a saída padrão, que em fprintf é um arquivo e em printf é o monitor. Protótipo: int fprintf (FILE *fp, const char *format,...); • Parâmetro 1: "FILE *fp" - o arquivo a ser escrito. • Parâmetro 2: "const char *format" - o que será escrito. Prof. Bruno Macchiavello 19 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fscanf Lê uma constante de caracteres de um arquivo, essa função funciona como scanf, sendo que a diferença é a entrada padrão que em fscanf é um arquivo e em scanf é o teclado. Protótipo: int fscanf (FILE *fp, const char *format,...); • Parâmetro 1: "FILE *fp" - o arquivo a ser lido. • Parâmetro 2: "const char *format" - qual a variável que receberá os dados do arquivo. Prof. Bruno Macchiavello 20 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • 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). Protótipo: char *fgets (char *str, int tamanho, FILE *fp); • Parâmetro 1 "char *str": a variável que receberá a string. • Parâmetro 2 "int tamanho": o limite máximo de caracteres a serem lidos. • Parâmetro 3 "FILE *fp": o arquivo que será lido. Prof. Bruno Macchiavello 21 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fputs Escreve uma string num arquivo. Protótipo: char *fputs (char *str, FILE *fp);Protótipo: char *fputs (char *str, FILE *fp); • Parâmetro 1: "char *str" - a variável que contém os dados a serem escritos no arquivo. • Parâmetro 2: "FILE *fp" - o arquivo a ser escrito. Prof. Bruno Macchiavello 22 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fread Leitura de bloco de dados. Protótipo: unsigned fread (void *buffer, int numero_de_bytes, int count, FILE *fp); • Parâmetro 1: "void *buffer" - variável na qual serão armazenados os • Parâmetro 1: "void *buffer"- variável na qual serão armazenados os dados lidos. • Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser lido. • Parâmetro 3: "int count" - indica quantas unidades devem ser lidas. • Parâmetro 4: "FILE *fp" - arquivo a ser lido. Prof. Bruno Macchiavello 23 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fwrite Leitura de bloco de dados. Protótipo: unsigned fwrite (void *buffer, int numero_de_bytes, int count, FILE *fp); • Parâmetro 1: "void *buffer" - variável na qual serão transmitidos os • Parâmetro 1: "void *buffer" - variável na qual serão transmitidos os dados ao arquivo. • Parâmetro 2: "int numero_de_bytes" - o número de bytes a ser escrito. • Parâmetro 3: "int count" - indica quantas unidades devem ser escritas. • Parâmetro 4: "FILE *fp" - arquivo a ser escrito. Prof. Bruno Macchiavello 24 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • fseek Procuras e acessos randômicos em arquivos. Esta move a posição corrente de leitura ou escrita no arquivo de um valor especificado, a partir de um ponto especificado. Protótipo: int fseek (FILE *fp, long numbytes, int origem); • Parâmetro 1: "FILE *fp" - arquivo a ser manipulado.• Parâmetro 1: "FILE *fp" - arquivo a ser manipulado. • Parâmetro 2: "long numbytes" - indica quantos bytes o cursor de posição do arquivo será movimentado apartir da sua posição atual. • Parâmetro 3: "int origem" - indica apartir de onde os numbytes serão contados. Abaixo uma tabela com os possíveis valores: SEEK_SET 0 Início do arquivo SEEK_CUR 1 Ponto corrente no arquivo SEEK_END 2 Fim do arquivo Prof. Bruno Macchiavello 25 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Resumo de Funções de Arquivos • rewind Retorna a posição corrente do arquivo para o início. • Protótipo: void rewind (FILE *fp); • Parâmetro: "FILE *fp" - arquivo a ser manipulado. Prof. Bruno Macchiavello 26 Departamento de Ciência da ComputaçãoDepartamento de Ciência da Computação Universidade Universidade de de BrasíliaBrasília Computação BásicaComputação Básica Exercícios • Fazer o trabalho 4 !! Prof. Bruno Macchiavello 27
Compartilhar