36
CURSO BÁSICO DE PROGRAMAÇÃO AULA 17 Manipulação de arquivos binários.

Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

  • Upload
    buimien

  • View
    221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

CURSO BÁSICO DE

PROGRAMAÇÃO –

AULA 17

Manipulação de arquivos binários.

Page 2: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Revisão – Abrindo arquivos de texto em C

• FILE *arquivo = fopen(<nome_do_arquivo>, <modo>);

• FILE: Tipo do objeto de arquivo.

• fopen: Função de abertura de arquivo.

• <nome_do_arquivo>: Endereço ou nome do arquivo.

• <modo>: Parâmetro que define de que forma o arquivo

desejado será aberto (a,r,rb+,etc...)

Page 3: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Revisão – Tipos de abertura de arquivo

Exemplos:

• Leitura:

• FILE *arquivo;

• arquivo = fopen(“C:/dados.txt”, “r”);

• Escrita:

• FILE * arquivo;

• arquivo = fopen(“C:/notas.txt”, “w”);

• Continuação (Concatenação):

• FILE * arquivo;

• arquivo = fopen(“C:/chamada.txt”, “a”);

Page 4: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Revisão – Tipos de abertura de arquivo

• Exemplos:

• Leitura e Escrita:

• FILE * arquivo;

• arquivo = fopen(“C:/arquivo.txt”, “r+”);

• Ou

• FILE * arquivo;

• meuFile = fopen(“C:/arquivo2.txt”, “w+”);

Page 5: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Revisão – Ler o conteúdo de um Arquivo

• Primeira forma:

fscanf(<variavel_de_arquivo>, "%s", <vetor_de_char>);

• Realiza a leitura até encontrar um espaço.

• <variavel_de_arquivo>: variável sobre a qual o arquivo foi aberto pela função “fopen”.

• <vetor_de_char>: vetor sobre o qual a palavra será armazenada.

Page 6: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Revisão – Ler o conteúdo de um Arquivo

• Segunda forma:

fgets(<vetor_de_char>, <tamanho>, <variavel_de_arquivo>);

• Lê uma quantidade especificada de caracteres.

• <variavel_de_arquivo>: variável sobre a qual o arquivo foi aberto pela função “fopen”.

• <vetor_de_char>: vetor sobre o qual a palavra será armazenada.

• <tamanho>: número de caracteres que desejamos ler do <variavel_de_arquivo>.

Page 7: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Escrevendo em um arquivo em C:

• Primeira forma:

fprintf(<variavel_de_arquivo>, <mensagem>);

• Lê uma palavra até que se encontra um espaço.

• <variavel_de_arquivo>: variável sobre a qual o arquivo foi aberto pela função “fopen”.

• <mensagem>: sequência de caracteres a qual o usuário deseja armazenar no arquivo.

Page 8: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Escrevendo em um arquivo em C:

• Segunda forma:

fputs(<mensagem>, <variavel_de_arquivo>);

• Lê uma palavra até que se encontra um espaço.

• <variavel_de_arquivo>: variável sobre a qual o arquivo foi aberto pela função “fopen”.

• <mensagem>: sequência de caracteres a qual o usuário deseja armazenar no arquivo.

Page 9: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exemplo:

Page 10: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Revisão - Salvando um arquivo em C:

fclose(<variavel_de_arquivo>);

fclose: Função de fechamento de arquivo.

• Retorna 0 se o arquivo foi salvo corretamente;

• Libera a memória que foi utilizada para trabalhar com o

arquivo;

• Desbloqueia o arquivo para uso em outros programas.

Page 11: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exemplo:

Page 12: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exercícios de revisão:

• Faça um programa que leia um arquivo texto do disco,

lendo linha a linha, e exibindo cada uma das linhas

numeradas na tela. A idéia é podermos pegar um arquivo

texto qualquer (pode ser inclusive o arquivo do programa

fonte – arquivo “.c” – de um destes exercícios) e mostrar

na tela com as linhas numeradas.

Page 13: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exercícios de revisão:

• Faça um programa que leia (do teclado) um cadastro de

10 alunos, indicando o nome, nota1, nota2. Calcule a

média aritmética simples dos 10 alunos e depois escreva

em um arquivo de 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.

Page 14: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Arquivos Binários:

• Arquivo binário é um arquivo no qual armazena um

conjunto de bits, que podem representar qualquer tipo de

informação.

• Um arquivo binário pode armazenar números, caracteres

e outros dados, que ao serem lidos serão processados

pelo computador.

• Diferente dos arquivos de texto, não é possível abrir um

arquivo binário com um editor de texto qualquer e

entender seu conteúdo, pois toda a informação está

codificada de forma binária.

Page 15: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Arquivos Binários:

• Por exemplo, se tentar abrir um arquivo do formato *.exe

com um editor de texto, verá algo parecido com isto:

• É perceptível que não é possível um humano entender a

informação contida neste arquivo.

Page 16: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Arquivos Binários:

• A linguagem de programação C fornece funções para que

o programador trabalhe utilizando arquivos binários.

Algumas destas são:

• fwrite() - Escreve um dado em um arquivo;

• fread() - Le um dado de um arquivo;

• fseek() - Move a posição de leitura de um arquivo;

• ftell() - Informa a posição de leitura de um arquivo;

• rewind() – Retorna à posição de leitura de um arquivo para o inicio;

• feof() – Informa se o arquivo está em seu fim;

Page 17: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Abrindo um arquivo binário

• Abrir um arquivo binário em C muito semelhante ao abrir

um arquivo de texto, a única diferença é o segundo

parâmetro passado à função fopen().

• Estes parametros são:

• wb – abre ou cria um arquivo binário para escrita.

• rb – abre um arquivo para leitura.

• rb+ - abre um arquivo tanto para leitura como escrita.

• Ex:

• FILE *arquivo = fopen(“arquivo.ext”,”rb+”);

Page 18: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Escrevendo em um arquivo binário

• A função fwrite() se encarrega de escrever dados em um

arquivo binário, contudo, seu uso é um pouco diferente

da função fprintf().

• A sintaxe da função fwrite() é: • fwrite(&<var>,<tam>,<mult>,<arq_ptr>);

• Onde: • &<var> = o endereço da variável a ser escrita.

• <tam> = o tamanho em bytes do tipo da variavel, geralmente obtido com o

auxilio da função sizeof();

• <mult> = multiplica o valor de <tam>, usado para escrever vetores e

strings, para variáveis normais o valor será 1.

• <arq_ptr> = ponteiro para o arquivo aberto.

Page 19: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exemplo de escrita em arquivo binário

Page 20: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Lendo um arquivo binário

• A função fread() realiza a leitura de um arquivo binário e

passa o valor lido para uma variável passada por

parâmetro à função.

• A sintaxe da função fread é: • fread(&<var>,<tam>,<mult>,<arq_ptr>);

• Onde: • &<var> = o endereço da variável que será passada o valor lido.

• <tam> = o tamanho em bytes do tipo da variavel, geralmente obtido com o

auxilio da função sizeof();

• <mult> = multiplica o valor de <tam>, usado para ler vetores e strings,

para variáveis normais o valor será 1.

• <arq_ptr> = ponteiro para o arquivo aberto.

Page 21: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exemplo de leitura em arquivo binário

Page 22: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Escrevendo e lendo em pontos específicos de

um arquivo • Quando se lê um arquivo binário, pode-se querer ler uma parte especifica do

arquivo, dado que o programador já conheça a estrutura do arquivo e onde se encontra a posição da informação desejada.

• Para tal, usa-se a função fseek(), que irá posicionar o leitor do arquivo para a posição desejada.

• Sua sintaxe é:

• fseek(<arq_ptr>, <descolamento>,<referencia>);

• Onde:

• <arq_ptr> = ponteiro para o arquivo aberto;

• <deslocamento> = tamanho em bytes desejados para deslocar o leitor do arquivo, valores negativos voltam o leitor para posições anteriores;

• <referencia> :

• SEEK_SET = informa que o deslocamento se dará a partir da posição inicial do arquivo;

• SEEK_CUR = informa que o deslocamento se dará a partir da posição atual do arquivo;

• SEEK_END = informa que o deslocamento se dará a partir da posição final do arquivo;

Page 23: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário

• Para entender a necessidade do uso da função

fseek(), e como o uso de uma função fwrite() ou

fread() pode afetar a obtenção de informações,

serão mostrados algumas imagens ilustrando

como funciona o posicionamento do leitor do

arquivo binário.

Page 24: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário

• A imagem ao lado mostra um arquivo

aberto contendo varias informações.

• Ao abrir um arquivo, sua posição de

leitura se localiza logo em seu inicio,

como mostrado na imagem.

• Cada tipo de dado possui um

tamanho, por exemplo, um char

possui 1 byte, um int e um float

possuem 4 bytes, e uma estrutura

definida pelo usuário tem tamanho

variável.

Page 25: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário

• Ao usar uma função fread() ou fwrite(), o leitor do arquivo

também ira se mover.

• Por exemplo, se usar a função desta forma:

• fread(&a,sizeof(int),1,arquivo)

• O leitor do arquivo estará assim:

Page 26: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário

• Se mudar o parâmetro de multiplicação de 1 para 2:

• fread(&a,sizeof(int),2,arquivo)

• O leitor do arquivo estará assim:

Page 27: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário • Usando a função fseek(), o programador pode mover o leitor do

arquivo sem escrever ou ler dado algum, isto é útil para não alterar o arquivo de forma equivocada.

• Por exemplo, se usar a função desta forma: fseek(arquivo, sizeof(int),SEEK_SET);

• O leitor do arquivo estará assim:

Page 28: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário • Caso seja usada novamente a função, o leitor do arquivo estará

assim:

• Perceba que não houve mudança na posição do leitor do arquivo.

Page 29: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário

• Isto se deve ao fato de que a <referencia> passada por

parâmetro à função referencia que o deslocamento deva

ser feito a partir no inicio do arquivo!

• Para que o leitor do arquivo se mova em relação a posição

atual do mesmo, a referencia de deslocamento deve ser

SEEK_CUR!

Page 30: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário

• A função fseek() não possui multiplicador de descolamento,

mas ainda assim é possível multiplicar o deslocamento

usando uma simples multiplicação do tamanho. Ex:

• fseek(arquivo, sizeof(int) * 2, SEEK_SET)

• O leitor do arquivo estará assim:

Page 31: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Funcionamento do posicionamento de leitura e

escrita um arquivo binário

• Para retornar o leitor do arquivo para seu inicio, não

importa de onde o mesmo estiver, a função rewind() deverá

ser usada. Ex:

• rewind(arquivo);

• Para verificar se o leitor do arquivo está na parte final do

arquivo, poderá ser usada a função feof(), que significa “file

end of file”. Ex

• feof(arquivo);

• feof() retornara 0 se o leitor não estiver no fim do arquivo, e 1 se

estiver.

Page 32: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exemplo do uso de fseek para ler e escrever dados

Page 33: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Escrita e leitura de estruturas

• É possível escrever uma estrutura criada pelo programador em um

arquivo binário de forma que não seja necessário escrever cada

atributo separadamente. O mesmo vale para a leitura de uma

estrutura.

• Para que isso seja feito, a função fwite() e fread() deverão ser

usadas desta forma:

• fread(&<var>,<tam_estrutura>,<mult>,<arq_ptr>);

• fwrite(&<var>,<tam_estrutura>,<mult>,<arq_ptr>);

• Onde: • &<var> = o endereço da variável do tipo da estrutura;

• <tam_estrutura> = o tamanho em bytes da estrutura, obtido por

sizeof(estrutura);

• <mult> = multiplica o valor de <tam_estrutura>, útil se quiser salvar um vetor

de estruturas, caso contrario o valor deve ser 1.

• <arq_ptr> = ponteiro para o arquivo aberto.

Page 34: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exemplo da escrita de uma estrutura

Page 35: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

Exercícios:

Faça uma função que leia os dados de uma estrutura, são

eles: nome, endereço, telefone, código do aluno. Logo em

seguida grave esses dados em um arquivo.dat.

Feito isso, você deverá fazer uma função para realizar a

busca do código do aluno e exibir os dados do mesmo na

tela, caso o código não exista mostre: “Aluno não

encontrado !”.

Page 36: Curso básico de programação – Aula 14 · CURSO BÁSICO DE PROGRAMAÇÃO ... (do teclado) um cadastro de ... •Para entender a necessidade do uso da função fseek(), e como

FIM Dúvidas?

Alexandre e Marcelo

[email protected], [email protected]