Top Banner
MC-102 Algoritmos e Programação de Computadores Prof. Ariel Vargas Unicamp Arquivos Binários
24

MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Dec 09, 2018

Download

Documents

dangnga
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

MC-102Algoritmos e Programação

de Computadores

Prof. Ariel Vargas

Unicamp

Arquivos Binários

Page 2: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Arquivos

� Arquivos Texto� Podem ser manipulados por um editor de texto comum

� Os dados são gravados como caracteres de 8 bits (1 byte). Ex:� O número 12345678 ocupa 8 bytes, ou seja, 64 bits

� Arquivos Binários� Dados são gravados na forma binária

� Costumam ser mais compactos. Ex:� O número 12345678 ocupa 4 bytes (considerado-se uma

máquina na qual um número inteiro é representado por 32 bits)

� Indicados para armazenar grandes quantidades de valores numéricos

Page 3: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Arquivos binários, qual a vantagem?

Page 4: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Como Manipular Arquivos Binários?

� Da mesma forma que um arquivo texto:

� É preciso abrir o arquivo antes de realizar leitura/escrita

� É preciso fechar o arquivo após realizar leitura/escrita

Page 5: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Arquivos Binários

� Para abrir e fechar uma arquivo binário usa-se, da mesma forma, as funções: (não muda nada!!!)

� Abrir um arquivo:� ponteiro_para_arquivo = fopen (nome_arquivo, modo_abertura );

� Fechar um arquivo:� fclose (ponteiro_para_arquivo );

Page 6: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Arquivos Binários

� Alguns modos de abertura: (tem um “b” agora)

� “rb” - abre arquivo binário para leitura� “wb” - cria arquivo binário para gravação, eliminando o conteúdo

anterior, se houver� “ab” - abre ou cria um arquivo binário para gravação em seu final� “r+b” - abre arquivo binário para leitura e gravação no início� “w+b” - cria arquivo binário para leitua/gravação no início� “a+b” - abre ou cria arquivo binário para leitura no início e

gravação no final

Page 7: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Arquivos Binários

Ler dados de um arquivo binário:

fread (endereco_da_variavel, tamanho_tipo_de_dado , numero_elementos, ponteiro_para_arquivo);

Ex:Int n;fread( &n, sizeof(int) , 1, f);

endereco_memoria, tamanho_tipo_de_dado, numero_elementos, ponteiro_para_arquivo

Page 8: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Arquivos Binários

Escrever dados em um arquivo binário:

fwrite (endereco_da_variavel, tamanho_tipo_de_dado , numero_elementos, ponteiro_para_arquivo);

Ex:Int n = 10;fwrite( &n, sizeof(int) , 1, f);

endereco_memoria, tamanho_tipo_de_dado, numero_elementos, ponteiro_para_arquivo

Page 9: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Lendo e escrevendo Vetores de um arquivo binário

#include<stdio.h>#include<stdlib.h>int main(){

int i, v[20] = {0, 1, 2, 3 ,4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19};int v2[20]; FILE *f; //ponteiro para arquivoint n = 20;

f = fopen ("vetor.bin", "wb"); //crio o arquivo para gravação

fwrite( &n,sizeof(int),1,f); //gravo “n” na primeira posição do arquivo

for (i=0;i<n;i++)fwrite( &v[i],sizeof(int),1,f); //gravo o vetor posição a posição

fclose(f); //fecho o arquivo

f = fopen ("vetor.bin", "rb"); //abro novamente para leiturafread( &n,sizeof(int),1,f); //leio a primeira posição q contem a quantidade de elementos do vetorprintf("%d\n",n); //imprimo a quantidade na tela

for (i=0;i<n;i++){fread (&v2[i] ,sizeof(int),1,f); //leio cada posição do vetor e armazeno em v2 na telaprintf("%d ",v2[i]) ; //imprimo cada posição de v2} }

Page 10: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

E daí....

Nenhuma vantagem até agora....

Page 11: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

#include<stdio.h>#include<stdlib.h>int main(){

int i, v[20] = {0, 1, 2, 3 ,4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19};int v2[20]; FILE *f; //ponteiro para arquivoint n = 20;

f = fopen ("vetor2.bin", "w+b"); //crio o arquivo para gravação e leitura

fwrite(&n,sizeof(int),1,f); //gravo “n” na primeira posição do arquivo

fwrite( &v,sizeof( v),1,f); //gravo o vetor todo de uma vez

rewind(f); //volto o ponteiro para a primeira posição do arquivo

fread(&n,sizeof(int),1,f); //leio a primeira posição q contem a quantidade de elementos do vetorprintf("%d\n",n); //imprimo a quantidade na tela

fread( &v2,sizeof( v),1,f); //leio o vetor todo e armazeno em v2

for (i=0;i<n;i++){ printf("%d ",v2[i]) ; } }

Alternativa a leitura do vetor de uma só vez

fread(&v2,sizeof(int),n,f);

Lendo e escrevendo Vetores de um arquivo binário

Page 12: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Matrizes

E como seria se eu precisasse trabalhar com uma matriz em um arquivo?

Page 13: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

#include<stdio.h>#include<stdlib.h>int main(){

int i,j, m[4][5] = {0,1,2,3,4, 5,6,7,8,9, 10,11,12,13,14, 15,16,17,18,19};

int m2[4][5]; FILE *f; //ponteiro para arquivoint l = 4;int c = 5;

f = fopen ("mat.bin", "w+b"); //crio o arquivo para gravação e leitura

fwrite(&l,sizeof(int),1,f); //gravo l na primeira posição do arquivofwrite(&c,sizeof(int),1,f); //gravo c na segunda posição do arquivo

fwrite( &m,sizeof( m),1,f); //gravo a matriz toda de uma vez

Lendo e escrevendo Matrizes em um arquivo binário

Page 14: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

rewind(f); //volto o ponteiro para a primeira posição do arquivo

fread(&l,sizeof(int),1,f); //leio “l” da primeira posição do arquivofread(&c,sizeof(int),1,f); //leio “c” da segunda posição do arquivo

printf("Matriz m[%d][%d] =\n",l,c); //imprimo o cabeçalho da matriz na tela

fread( &m2,sizeof( m),1,f); //leio a matriz toda e armazeno em m2

for (i=0;i<l;i++){ for (j=0;j<c;j++)

printf("%d ",m2[i][j]); //imprimo cada posição de m2 na telaprintf("\n");

}}

Lendo e escrevendo Matrizes em um arquivo binário

Page 15: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Registros

E com registros?

Page 16: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Registros

Exemplo leitura...:

typedef struct {char nome[20];float media;}tipo_aluno ;

tipo_aluno a;tipo_aluno vet[100];

fread(&a,sizeof(tipo_aluno),1,f); //lendo um registro;fread(& vet ,sizeof(tipo_aluno), 100,f); //lendo o vetor todofread(& vet ,sizeof( vet),1,f); //lendo o vetor todo;

Page 17: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Registros

Exemplo escrita:

typedef struct {char nome[20];float media;}tipo_aluno ;

tipo_aluno a;tipo_aluno vet[100];

fwrite(&a,sizeof(tipo_aluno),1,f); //escrevendo um registro;fwrite(& vet ,sizeof(tipo_aluno), 100,f); // escrevendo o vetor todofwrite(& vet ,sizeof( vet ),1,f); // escrevendo o vetor todo;

Page 18: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Como acessar um dado ou registro sem

precisar ler o arquivo seqüencialmente?

�Função:fseek (ponteiro_para_arquivo, posicao_relativa , marcação);

Posiciona o ponteiro para arquivo binário, relativamente à marcação indicada:

• SEEK_SET – início do arquivo• SEEK_CUR – posição corrente do arquivo• SEEK_END – final do arquivo

Page 19: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Exemplo fseek e registros

#include<stdio.h>#include<stdlib.h>

typedef char Disc[5]; //definindo um tipo de dado novo

typedef struct{int RA;char nome[30];Disc matriculas[6]; //vetor do novo tipo definido Discfloat CR;

}tipo_Reg_aluno;

Page 20: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Exemplo fseek e registros

int main(){

FILE *f; tipo_Reg_aluno Vet[2] = {{12436, "Maria", {"MC102", "MA141", "F 128", "F 129"}, 0.0},{12232, "João", {"MC202", "MA211", "F 228", "F 229"}, 0.8}

};tipo_Reg_aluno aux ;

f = fopen ("dados_aluno.bin", "wb"); //crio o arquivo

fwrite( Vet, sizeof( tipo_Reg_aluno ), 2, f); //gravo o vetor inteiro no arquivo

fclose(f); //fecho o arquivo

Page 21: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Exemplo fseek e registros

f = fopen ("dados_aluno.bin", "r+b "); //abro novamente para alterar

fseek(f, 2 * sizeof( tipo_Reg_aluno ), SEEK_SET);//posiciono o ponteiro no segundo registro

fread(&aux , sizeof(tipo_Reg_aluno), 1, f); //leio o registro e guardo em aux

aux.RA = 61122; //altero o ra do aluno

fseek(f, 2 * sizeof(tipo_Reg_aluno), SEEK_SET); //posiciono o ponteiro denovo no registro

fwrite (&aux , sizeof(tipo_Reg_aluno), 1, f); //Sobrescrevo o registro atualizado no arquivo

fclose(f); //fecho o arquivo

Page 22: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Exercício 1

Dado o arquivo “numeros.bin” que possui em sua primeira posição um inteiro que indica a quantidade de elementos de um vetor e nas demais posições valores inteiros:

Ex: 100 10 5 15 21 3 99 101 458 22 ....

a) Escreva um programa que leia os elementos do arquivo e guarde-os em um vetor;

b) Verifique se cada número é primo;c) Armazene os números primos em um novo arquivo binário que

deve ter o seguinte formato:• na primeira posição a quantidade de primos• Nas demais posições os números primos

Utilize a função ehprimo para verificar se um número é primo para verificar se cada número é primo

Page 23: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Exercício 1

// --------------------função eh primo------------------------------------------int ehprimo (int n){ // n é o parâmetro de entradaint resto,i, primo=1; //define primo como verdadeiro

for (i=2;i<n;i++){ // divide o n por todos os anterioresresto = n % i;

if (resto == 0)primo=0;

}if (primo)

return 1; // retorna verdadeiro, é primoelse

return 0; // retorna falso, não é primo}//-------------------------------------------------------------------------------

Page 24: MC-102 Algoritmos e Programação de Computadoresbit/ensino/mc102_1s08/class16/class16-2.pdf · Dado o arquivo “numeros.bin” que possui em sua prime ira posição um inteiro que

Exercício 2

Baseando-se no exemplo “Exemplo fseek e registros” altere o programa para que ele atualize o CR de uma aluno informado pelo usuário. O usuário informa o RA do aluno e o novo CR.

O programa deve localizar o aluno pelo RA e atualizar o registro no arquivo.