Buscar

Aula 2 - Arquivos Parte II

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

Continue navegando