Baixe o app para aproveitar ainda mais
Prévia do material em texto
Laboratório de Programação Operações com arquivos - Parte II Arquivos Binários em C Prof. Daniel Vecchiato daniel@ic.ufmt.br quarta-feira, 13 de março de 2013 Conteúdo Abordado • Tipo de dados; • Algoritmos em C e Pascal; • Estruturas de controle; • Estruturas de repetição; • Variáveis compostas homogêneas; • Variáveis compostas heterogêneas; • Modularização: Blocos e Subprogramas; • Parâmetros e formas de passagem; • Recursividade. quarta-feira, 13 de março de 2013 Conteúdo a ser abordado • Operações com arquivos; • Variáveis dinâmicas; • Estruturas de dados dinâmicas: listas lineares; • Métodos simples de ordenação e pesquisa de dados. quarta-feira, 13 de março de 2013 Agenda • Revisão; • Resolução dos exercícios; • Arquivos Binários; • Escrita em arquivos binários; • Leitura em arquivos binários; • Resumo; • Exercicios quarta-feira, 13 de março de 2013 Revisão • Crie um ponteiro para o arquivo: FILE *parq; • Abra o arquivo de modo apropriado associando-o a um ponteiro: • parq = fopen(“nomeArquivo”, “modo”); • Leia dados do arquivo na memória usando fscanf • fscanf(parq, string-tipo-variavel, &variavel); • Dados podem ser lidos até EOF. • Altere dados se necessário e escreva-o novamente em arquivo • fprintf(parq, string-tipo-variavel, variavel); • Todo arquivo deve ser fechado • fclose(parq); quarta-feira, 13 de março de 2013 Exercícios • (1) Faça um programa que conte o número de caracteres de um arquivo texto e imprima o resultado na tela. • (II) Escreva um programa que compare dois arquivos especificados pelo usuário e imprima sempre que os caracteres dos dois coincidirem. quarta-feira, 13 de março de 2013 Exercícios • (III) Faça um programa que solicite o nome de um arquivo e conte quantas palavras existem nesse arquivo, informando o usuário (outra parte do comando wc). Considere que uma palavra é separada de outra por um espaço em branco ou um final de linha. quarta-feira, 13 de março de 2013 Arquivos Binários • Vimos que existem dois tipos de arquivos: texto e binário; • Variáveis int ou float têm tamanho fixo na memória, por exemplo um int ocupa 4 bytes. • Representação em texto precisa de um número variável de dígitos (10, 5.634, 100.300) • Lembre que cada caracter é um char e usa 1 byte de memória. quarta-feira, 13 de março de 2013 Arquivos Binários • Armazenar dados em arquivos de forma análoga a utilizada em memória permite: • Reduzir o tamanho do arquivo; • Guardar estruturas complicadas tendo acesso simples. quarta-feira, 13 de março de 2013 Arquivos Binários • Assim como em arquivos texto, devemos criar um ponteiro para arquivos. • Podemos então associa-lo com um arquivo através do comando fopen. FILE *arq; arq = fopen(“arquivo.bin”, “rb”); quarta-feira, 13 de março de 2013 Arquivos Binários Um pouco mais sobre a função fopen. FILE* fopen(const char *caminho, char *modo); quarta-feira, 13 de março de 2013 Arquivos Binários • Se um arquivo que não existe for aberto para a leitura(rb), a função retorna NULL. • Se um arquivo que não existe for aberto para a escrita (wb), um novo arquivo é criado, se ele existir é sobrescrito. quarta-feira, 13 de março de 2013 Arquivos Binários • Se um arquivo é aberto para a leitura e gravação (r+b), ele não é sobrescrito. Se o arquivo não existir a função retornar NULL. • Se um arquivo existente for aberto para a gravação/escrita (w+b), ele é sobrescrito. Se o arquivo não existir um novo é criado. quarta-feira, 13 de março de 2013 Arquivos Binários • As funções fread e fwrite permitem, respectivamente, a leitura e escrita de blocos de dados; • Devemos determinar o número de elementos a serem lidos ou gravados e o tamanho de cada um. quarta-feira, 13 de março de 2013 Arquivos Binários • Para escrever um arquivo binário usamos a função fwrite. • pt-mem: Ponteiro para região de memória contendo os dados a serem gravados. • size: Número de bytes de um item. • num-items: Número de itens que devem ser gravados. • pt-arq: Ponteiro para o arquivo quarta-feira, 13 de março de 2013 Arquivos Binários • Podemos gravar double em binário do seguinte modo: quarta-feira, 13 de março de 2013 • Podemos gravar um vetor de double em binário da seguinte forma: Arquivos Binários quarta-feira, 13 de março de 2013 Arquivos Binários • Para ler um arquivo binário usamos a função fread. • pt-mem: Ponteiro para região de memória (já alocada) para onde os dados serão lidos. • size: Número de bytes de um item a ser lido. • num-items: Número de itens que deve ser lido. • pt-arq: Ponteiro para o arquivo. quarta-feira, 13 de março de 2013 • Usando o exemplo anterior podemos ler um double em formato binário Arquivos Binários quarta-feira, 13 de março de 2013 • Usando o exemplo anterior podemos o vetor de double em formato binário Arquivos Binários quarta-feira, 13 de março de 2013 Arquivos Binários • Lembre-se do indicador de posição de um arquivo, que assim que é aberto é apontado para o início do arquivo. • Quando lemos uma determinada quantidade de itens, o indicador de posição automaticamente avança para o próximo item não lido. • Quando escrevemos algum item, o indicador de posição automaticamente avança para a posição seguinte do item escrito. quarta-feira, 13 de março de 2013 Arquivos Binários • Se na leitura não sabemos exatamente quantos itens estão gravados, podemos usar o que é devolvido pela função fread: • Esta função devolve o número de itens corretamente lidos. • Se alcançarmos o final do arquivo e tentarmos ler algo, ela devolve 0. quarta-feira, 13 de março de 2013 Arquivos Binários • No exemplo do vetor poderíamos ter lido os dados como segue: • Ou de forma equivalente: quarta-feira, 13 de março de 2013 quarta-feira, 13 de março de 2013 Exercício • IV - Escreva um programa em C que escreva uma sequência de notas (float) em um arquivo binário, as notas devem ser lidas do teclado e devem ter o valor de 0 a 10; • V - Escreva um programa que leia o arquivo binário gerado no exercício anterior e imprima a média dos números gravados. quarta-feira, 13 de março de 2013 Acesso não sequencial • Fazemos o acesso não sequencial usando a função fseek. • Esta função altera a posição de leitura/escrita no arquivo. • O deslocamento pode ser relativo ao: • inicio do arquivo (SEEK_SET) • ponto atual (SEEK_CUR) • final do arquivo (SEEK_END) quarta-feira, 13 de março de 2013 Acesso não sequencial • pt-arq: ponteiro para arquivo. • num-bytes: quantidade de bytes para se deslocar. • origem: posição de início do deslocamento (SEEK_SET, SEEK_CUR, SEEK_END). quarta-feira, 13 de março de 2013 Acesso não sequencial • Por exemplo se quisermos alterar o terceiro double de um vetor escrito: quarta-feira, 13 de março de 2013 quarta-feira, 13 de março de 2013 Registros • Um arquivo pode armazenar registros (como um banco de dados). • Isso pode ser feito de forma simples se lembrarmos que um registro como qualquer variável em C, tem um tamanho fixo. • O acesso a cada registro pode ser direto, usando a função fseek. • A leitura ou escrita do registro pode ser feita usando as funções fread e fwrite. quarta-feira, 13 de março de 2013 Exemplo com Registros • Vamos fazer uma aplicação para um cadastro de alunos. quarta-feira, 13 de março de 2013 Definições quarta-feira, 13 de março de 2013 Função Principal quarta-feira, 13 de março de 2013 Função que Imprime quarta-feira, 13 de março de 2013 Função que altera o registroquarta-feira, 13 de março de 2013 Exercícios • VI - Escreva um programa em C que leia um arquivo binário contendo uma sequência de números inteiros, e apresente o maior e menor valor contido nesse arquivo. • VII - Escreva um programa para armazenar informações (nome, telefone) de 5 contatos. • VIII - Escreva um programa para ler os contatos do exercício anterior e imprimir na tela quarta-feira, 13 de março de 2013 Exercícios • IX - Faça um programa que leia (do teclado) um cadastro de 10 alunos e depois escreva em um arquivo texto os dados de cada aluno: nome, nota1, nota2 e média. Lembre-se de que as notas e média deverão ser apresentadas como valores que possuem até 2 casas após a vírgula. quarta-feira, 13 de março de 2013
Compartilhar