You are on page 1of 12

Matrizes

E como seria se eu
precisasse trabalhar com
uma matriz em um arquivo?
#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 arquivo
int l = 4;
int c = 5;
f = fopen ("mat.bin", "w+b"); //crio o arquivo para
gravao e leitura
fwrite(&l,sizeof(int),1,f); //gravo l na primeira
posio do arquivo
fwrite(&c,sizeof(int),1,f); //gravo c na segunda
posio do arquivo
fwrite(&m,sizeof(m),1,f); //gravo a matriz toda de
uma vez

Lendo e escrevendo Matrizes em


um arquivo binrio
rewind(f); //volto o ponteiro para a primeira
posio do arquivo
fread(&l,sizeof(int),1,f); //leio l da primeira
posio do arquivo

fread(&c,sizeof(int),1,f); //leio c da segunda


posio do arquivo
printf("Matriz m[%d][%d] =\n",l,c); //imprimo o
cabealho 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 posio
de m2 na tela
printf("\n");
}
}

Lendo e escrevendo Matrizes em


um arquivo binrio

Registros
E com registros?

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 todo
fread(&vet,sizeof(vet),1,f); //lendo o
vetor todo;

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 todo
fwrite(&vet,sizeof(vet),1,f); // escrevendo o
vetor todo;

Como acessar um dado ou


registro sem
precisar ler o arquivo
seqencialmente?

_Funo:

fseek (ponteiro_para_arquivo,
posicao_relativa, marcao);

Posiciona o ponteiro para arquivo


binrio,
relativamente marcao indicada:
SEEK_SET incio do arquivo
SEEK_CUR posio corrente do arquivo
SEEK_END final do arquivo

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 Disc
float CR;
}tipo_Reg_aluno;

Exemplo fseek e registros


int main(){
FILE *f;
tipo_Reg_aluno Vet[2] = {
{12436, "Maria", {"MC102", "MA141", "F 128",
"F 129"}, 0.0},

{12232, "Joo", {"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

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

Exerccio 1

Dado o arquivo numeros.bin que possui


em sua primeira posio
um inteiro que indica a quantidade de
elementos de um vetor e

nas demais posies 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 nmero primo;
c) Armazene os nmeros primos em um
novo arquivo binrio que
deve ter o seguinte formato:
na primeira posio a quantidade de
primos
Nas demais posies os nmeros primos
Utilize a funo ehprimo para verificar se
um nmero primo para
verificar se cada nmero primo

Exerccio 1

// --------------------funo eh
primo-----------------------------------------int ehprimo (int n){ // n o parmetro de
entrada
int resto,i, primo=1; //define primo como
verdadeiro
for (i=2;i<n;i++){ // divide o n por todos os
anteriores
resto = n % i;
if (resto == 0)

primo=0;
} if (
primo)
return 1; // retorna verdadeiro, primo
else
return 0; // retorna falso, no primo
} //------------------------------------------------------------------------------

Exerccio 2
Baseando-se no exemplo Exemplo
fseek e registros altere
o programa para que ele atualize o CR
de uma aluno
informado pelo usurio. O usurio
informa o RA do aluno e
o novo CR.
O programa deve localizar o aluno pelo
RA e atualizar o
registro no arquivo.

MC-102

Algoritmos e
Programao
de Computadores
Prof. Ariel Vargas
Unicamp
Arquivos Binrios

Arquivos
_ Arquivos Texto
_ Podem ser manipulados por um
editor de texto comum
_ Os dados so gravados como
caracteres de 8 bits (1
byte). Ex:
_ O nmero 12345678 ocupa 8 bytes, ou seja,
64 bits

_ Arquivos Binrios
_ Dados so gravados na forma binria
_ Costumam ser mais compactos. Ex:
_ O nmero 12345678 ocupa 4 bytes
(considerado-se uma
mquina na qual um nmero inteiro
representado por 32

bits)

_ Indicados para armazenar grandes


quantidades de
valores numricos

Arquivos binrios, qual a


vantagem?
Como Manipular Arquivos
Binrios?
_ Da mesma forma que um
arquivo texto:
_ preciso abrir o arquivo antes
de realizar
leitura/escrita
_ preciso fechar o arquivo aps
realizar
leitura/escrita

Arquivos Binrios
_ Para abrir e fechar uma arquivo
binrio usa-se, da mesma
forma, as funes: (no muda nada!!!)

_ Abrir um arquivo:

_ ponteiro_para_arquivo = fopen
(nome_arquivo, modo_abertura);

_ Fechar um arquivo:
_ fclose (ponteiro_para_arquivo);

Arquivos Binrios

_ Alguns modos de abertura: (tem um


b agora)
endereco_memoria, tamanho_tipo_de_dado,
numero_elementos, ponteiro_para_arquivo

Lendo e escrevendo Vetores de um


arquivo binrio
#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 arquivo
int n = 20;
f = fopen ("vetor.bin", "wb"); //crio o arquivo para gravao
fwrite(&n,sizeof(int),1,f); //gravo n na primeira posio do arquivo
for (i=0;i<n;i++)
fwrite(&v[i],sizeof(int),1,f); //gravo o vetor posio a posio
fclose(f); //fecho o arquivo
f = fopen ("vetor.bin", "rb"); //abro novamente para leitura
fread(&n,sizeof(int),1,f); //leio a primeira posio q contem a
quantidade de elementos do vetor
printf("%d\n",n); //imprimo a quantidade na tela
for (i=0;i<n;i++){
fread(&v2[i],sizeof(int),1,f); //leio cada posio do vetor e
armazeno em v2 na tela
printf("%d ",v2[i]) ; //imprimo cada posio de v2

_ rb - abre arquivo binrio para leitura

_ wb - cria arquivo binrio para gravao,


eliminando o contedo
anterior, se houver
_ ab - abre ou cria um arquivo binrio para
gravao em seu final
_ r+b - abre arquivo binrio para leitura e
gravao no incio
_ w+b - cria arquivo binrio para
leitua/gravao no incio
_ a+b - abre ou cria arquivo binrio para
leitura no incio e
gravao no final

Arquivos Binrios
Ler dados de um arquivo binrio:
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

Arquivos Binrios
Escrever dados em um arquivo binrio:

fwrite (endereco_da_variavel,
tamanho_tipo_de_dado,
numero_elementos,
ponteiro_para_arquivo);
Ex:
Int n = 10;

fwrite(&n, sizeof(int), 1, f);

You might also like