Arquivos binários - LIV

Transcrição

Arquivos binários - LIV
MC-102 - Arquivos binários
Elaborado por Raoni Teixeira e Editado por Danillo Roberto Pereira
Instituto de Computação – Unicamp
Primeiro Semestre de 2013
Roteiro
1
Arquivos binários
2
Escrevendo e lendo arquivos binários
3
Localização do ponteiro de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
2 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Introdução
Tamanho de dados
Existem dois tipos de arquivos: textos e binários.
Qual o tamanho gasto para representar o número 12345678.9:
I
I
em arquivo de texto: 10 bytes (10 caracteres)
em arquivo binário: 4 bytes (1 float)
E o número 1.2:
I
I
em arquivo de texto: 3 bytes (3 caracteres)
em arquivo binário: 4 bytes (1 float)
Conclusão: dados salvos como texto têm tamanhos variáveis e dados
binários têm tamanhos fixos.
Vantagens de utilizar arquivos binários
reduz o tamanho do arquivo
simplifica o armazenamento de estruturas complicadas
permite saber a posição de um dado no arquivo (conhecemos o
tamanho de todos os dados)
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
3 / 18
Arquivos Binário em C
Abrindo um arquivo binário
Igual a um arquivo de texto:
criamos uma referência FILE *arq
abrimos em modo binário (exemplo "rb")
verificamos erros e fechamos o arquivo
int main() {
FILE *arq;
arq = fopen("arquivo.bin","rb");
if (arq == NULL) {
perror("arquivo.bin");
return 1;
}
// manipula arquivo binário aqui...
fclose(arq);
return 0;
}
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
4 / 18
Arquivos Binário em C
Abrindo um arquivo binário
Igual a um arquivo de texto:
criamos uma referência FILE *arq
abrimos em modo binário (exemplo "rb")
verificamos erros e fechamos o arquivo
int main() {
FILE *arq;
arq = fopen("arquivo.bin","rb");
if (arq == NULL) {
perror("arquivo.bin");
return 1;
}
// manipula arquivo binário aqui...
fclose(arq);
return 0;
}
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
4 / 18
Arquivos Binário em C
Abrindo um arquivo binário
Igual a um arquivo de texto:
criamos uma referência FILE *arq
abrimos em modo binário (exemplo "rb")
verificamos erros e fechamos o arquivo
int main() {
FILE *arq;
arq = fopen("arquivo.bin","rb");
if (arq == NULL) {
perror("arquivo.bin");
return 1;
}
// manipula arquivo binário aqui...
fclose(arq);
return 0;
}
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
4 / 18
Arquivos Binário em C
Abrindo um arquivo binário
Igual a um arquivo de texto:
criamos uma referência FILE *arq
abrimos em modo binário (exemplo "rb")
verificamos erros e fechamos o arquivo
int main() {
FILE *arq;
arq = fopen("arquivo.bin","rb");
if (arq == NULL) {
perror("arquivo.bin");
return 1;
}
// manipula arquivo binário aqui...
fclose(arq);
return 0;
}
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
4 / 18
Arquivos Binário em C
Abrindo um arquivo binário
Igual a um arquivo de texto:
criamos uma referência FILE *arq
abrimos em modo binário (exemplo "rb")
verificamos erros e fechamos o arquivo
int main() {
FILE *arq;
arq = fopen("arquivo.bin","rb");
if (arq == NULL) {
perror("arquivo.bin");
return 1;
}
// manipula arquivo binário aqui...
fclose(arq);
return 0;
}
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
4 / 18
Modos de abertura de arquivos binários
Modos de abertura de arquivo
modo
"rb"
"r+b"
"wb"
"w+b"
operações
leitura
leitura e escrita
escrita
escrita e leitura
Danillo Roberto Pereira (IC-UNICAMP)
ponto no arquivo
início
início
início (trunca arquivo)
início (trunca arquivo)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
5 / 18
Organizando arquivos em blocos
Blocos
Como organizar um arquivo binário?
vamos organizar o arquivo da mesma maneira que organizamos a
memória do computador
cada dado vai ser armazenado em um bloco do arquivo como se fosse
uma variável
a posição de cada dado depende da ordem e do tamanho dos dados
armazenados
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
Danillo Roberto Pereira (IC-UNICAMP)
8
...
35 36 37 38
char nome[30];
MC-102 - Arquivos binários
Primeiro Semestre de 2013
6 / 18
Organizando arquivos em blocos
Blocos
Como organizar um arquivo binário?
vamos organizar o arquivo da mesma maneira que organizamos a
memória do computador
cada dado vai ser armazenado em um bloco do arquivo como se fosse
uma variável
a posição de cada dado depende da ordem e do tamanho dos dados
armazenados
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
Danillo Roberto Pereira (IC-UNICAMP)
8
...
35 36 37 38
char nome[30];
MC-102 - Arquivos binários
Primeiro Semestre de 2013
6 / 18
Organizando arquivos em blocos
Blocos
Como organizar um arquivo binário?
vamos organizar o arquivo da mesma maneira que organizamos a
memória do computador
cada dado vai ser armazenado em um bloco do arquivo como se fosse
uma variável
a posição de cada dado depende da ordem e do tamanho dos dados
armazenados
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
Danillo Roberto Pereira (IC-UNICAMP)
8
...
35 36 37 38
char nome[30];
MC-102 - Arquivos binários
Primeiro Semestre de 2013
6 / 18
Organizando arquivos em blocos
Blocos
Como organizar um arquivo binário?
vamos organizar o arquivo da mesma maneira que organizamos a
memória do computador
cada dado vai ser armazenado em um bloco do arquivo como se fosse
uma variável
a posição de cada dado depende da ordem e do tamanho dos dados
armazenados
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
Danillo Roberto Pereira (IC-UNICAMP)
8
...
35 36 37 38
char nome[30];
MC-102 - Arquivos binários
Primeiro Semestre de 2013
6 / 18
Organizando arquivos em blocos
Blocos
Como organizar um arquivo binário?
vamos organizar o arquivo da mesma maneira que organizamos a
memória do computador
cada dado vai ser armazenado em um bloco do arquivo como se fosse
uma variável
a posição de cada dado depende da ordem e do tamanho dos dados
armazenados
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
Danillo Roberto Pereira (IC-UNICAMP)
8
...
35 36 37 38
char nome[30];
MC-102 - Arquivos binários
Primeiro Semestre de 2013
6 / 18
Escrevendo em um arquivo binário
Para escrever em um arquivo binário, vamos utilizar a função
Função de escrita
fwrite(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fwrite
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
I
podemos saber o tamanho de uma variável com: sizeof(tipo)
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de escrita
A declaração void *bloco significa que
a variável do bloco pode ter qualquer tipo!
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
7 / 18
Escrevendo em um arquivo binário
Para escrever em um arquivo binário, vamos utilizar a função
Função de escrita
fwrite(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fwrite
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
I
podemos saber o tamanho de uma variável com: sizeof(tipo)
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de escrita
A declaração void *bloco significa que
a variável do bloco pode ter qualquer tipo!
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
7 / 18
Escrevendo em um arquivo binário
Para escrever em um arquivo binário, vamos utilizar a função
Função de escrita
fwrite(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fwrite
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
I
podemos saber o tamanho de uma variável com: sizeof(tipo)
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de escrita
A declaração void *bloco significa que
a variável do bloco pode ter qualquer tipo!
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
7 / 18
Escrevendo em um arquivo binário
Para escrever em um arquivo binário, vamos utilizar a função
Função de escrita
fwrite(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fwrite
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
I
podemos saber o tamanho de uma variável com: sizeof(tipo)
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de escrita
A declaração void *bloco significa que
a variável do bloco pode ter qualquer tipo!
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
7 / 18
Escrevendo em um arquivo binário
Para escrever em um arquivo binário, vamos utilizar a função
Função de escrita
fwrite(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fwrite
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
I
podemos saber o tamanho de uma variável com: sizeof(tipo)
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de escrita
A declaração void *bloco significa que
a variável do bloco pode ter qualquer tipo!
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
7 / 18
Escrevendo em um arquivo binário
Para escrever em um arquivo binário, vamos utilizar a função
Função de escrita
fwrite(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fwrite
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
I
podemos saber o tamanho de uma variável com: sizeof(tipo)
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de escrita
A declaração void *bloco significa que
a variável do bloco pode ter qualquer tipo!
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
7 / 18
Escrevendo em um arquivo binário
Para escrever em um arquivo binário, vamos utilizar a função
Função de escrita
fwrite(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fwrite
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
I
podemos saber o tamanho de uma variável com: sizeof(tipo)
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de escrita
A declaração void *bloco significa que
a variável do bloco pode ter qualquer tipo!
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
7 / 18
Escrevendo dados do aluno
Exemplo
int ra, telefone;
char nome[30];
FILE *arq;
arq = fopen("dados_aluno.bin", "wb");
scanf("%d", &ra);
scanf("%d", &telefone);
scanf("%s", nome);
fwrite(&ra, sizeof(int), 1, arq);
fwrite(&telefone, sizeof(int), 1, arq);
fwrite(nome, sizeof(char), 30, arq);
fclose(arq);
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
8 / 18
Lendo de um arquivo binário
Para ler de um arquivo binário, vamos utilizar a função
Função de leitura
fread(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fread
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de leitura
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
9 / 18
Lendo de um arquivo binário
Para ler de um arquivo binário, vamos utilizar a função
Função de leitura
fread(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fread
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de leitura
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
9 / 18
Lendo de um arquivo binário
Para ler de um arquivo binário, vamos utilizar a função
Função de leitura
fread(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fread
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de leitura
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
9 / 18
Lendo de um arquivo binário
Para ler de um arquivo binário, vamos utilizar a função
Função de leitura
fread(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fread
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de leitura
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
9 / 18
Lendo de um arquivo binário
Para ler de um arquivo binário, vamos utilizar a função
Função de leitura
fread(void *bloco, int tamanho, int num_blocos, FILE *arq);
Parâmetros da fread
bloco: é uma referência para a variável do bloco
tamanho: é o tamanho em bytes de cada bloco
num_blocos: é o número de blocos armazenados em sequência
arq: é a referência para o arquivo aberto em modo de leitura
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
9 / 18
Lendo dados do aluno
Exemplo
int ra, telefone;
char nome[30];
FILE *arq;
arq = fopen("dados_aluno.bin", "rb");
fread(&ra, sizeof(int), 1, arq);
fread(&telefone, sizeof(int), 1, arq);
fread(nome, sizeof(char), 30, arq);
printf("%d", ra);
printf("%d", telefone);
printf("%s", nome);
fclose(arq);
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
10 / 18
Lidando com estruturas e vetores
Estruturas complexas
As funções fwrite a fread podem receber qualquer tipo de variável e em
qualquer número:
podemos gravar uma estrutura inteira de uma só vez
também podemos gravar um vetor inteiro de uma só vez
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
11 / 18
Lidando com estruturas e vetores
Estruturas complexas
As funções fwrite a fread podem receber qualquer tipo de variável e em
qualquer número:
podemos gravar uma estrutura inteira de uma só vez
também podemos gravar um vetor inteiro de uma só vez
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
11 / 18
Lidando com estruturas e vetores
Estruturas complexas
As funções fwrite a fread podem receber qualquer tipo de variável e em
qualquer número:
podemos gravar uma estrutura inteira de uma só vez
também podemos gravar um vetor inteiro de uma só vez
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
11 / 18
Armazenado um vetor de estruturas
#define NUM_ALUNOS 100
typedef struct {
int ra, telefone;
} Ficha;
Ficha ler_ficha() {
Ficha ficha;
scanf("%d%d", &ficha.ra, &ficha.telefone);
return ficha;
}
int main() {
Ficha fichas[NUM_ALUNOS];
FILE *arq;
int i;
arq = fopen("fichas.bin", "wb");
for (i = 0; i < NUM_ALUNOS; i++)
fichas[i] = ler_ficha();
fwrite(fichas, sizeof(Ficha), NUM_ALUNOS, arq);
fclose(arq);
return 0;
}
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
12 / 18
Encontrando o final de arquivo
Lendo um vetor de inteiros do arquivo
quando lemos um inteiro, o ponteiro do arquivo avança
como saber quando o ponteiro chegou no final de arquivo?
podemos utilizar a função feof(arquivo)
I
retorna verdadeiro quando chegou no final do arquivo
Testando pelo final de arquivo
int i, vetor[1000];
FILE *arq;
arq = fopen("inteiros.bin", "rb");
i = 0;
while (!feof(arq)) {
fread(&vetor[i], sizeof(int), 1, arq);
i++;
}
fclose(arq);
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
13 / 18
Encontrando o final de arquivo
Lendo um vetor de inteiros do arquivo
quando lemos um inteiro, o ponteiro do arquivo avança
como saber quando o ponteiro chegou no final de arquivo?
podemos utilizar a função feof(arquivo)
I
retorna verdadeiro quando chegou no final do arquivo
Testando pelo final de arquivo
int i, vetor[1000];
FILE *arq;
arq = fopen("inteiros.bin", "rb");
i = 0;
while (!feof(arq)) {
fread(&vetor[i], sizeof(int), 1, arq);
i++;
}
fclose(arq);
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
13 / 18
Encontrando o final de arquivo
Lendo um vetor de inteiros do arquivo
quando lemos um inteiro, o ponteiro do arquivo avança
como saber quando o ponteiro chegou no final de arquivo?
podemos utilizar a função feof(arquivo)
I
retorna verdadeiro quando chegou no final do arquivo
Testando pelo final de arquivo
int i, vetor[1000];
FILE *arq;
arq = fopen("inteiros.bin", "rb");
i = 0;
while (!feof(arq)) {
fread(&vetor[i], sizeof(int), 1, arq);
i++;
}
fclose(arq);
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
13 / 18
Encontrando o final de arquivo
Lendo um vetor de inteiros do arquivo
quando lemos um inteiro, o ponteiro do arquivo avança
como saber quando o ponteiro chegou no final de arquivo?
podemos utilizar a função feof(arquivo)
I
retorna verdadeiro quando chegou no final do arquivo
Testando pelo final de arquivo
int i, vetor[1000];
FILE *arq;
arq = fopen("inteiros.bin", "rb");
i = 0;
while (!feof(arq)) {
fread(&vetor[i], sizeof(int), 1, arq);
i++;
}
fclose(arq);
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
13 / 18
Encontrando o final de arquivo
Lendo um vetor de inteiros do arquivo
quando lemos um inteiro, o ponteiro do arquivo avança
como saber quando o ponteiro chegou no final de arquivo?
podemos utilizar a função feof(arquivo)
I
retorna verdadeiro quando chegou no final do arquivo
Testando pelo final de arquivo
int i, vetor[1000];
FILE *arq;
arq = fopen("inteiros.bin", "rb");
i = 0;
while (!feof(arq)) {
fread(&vetor[i], sizeof(int), 1, arq);
i++;
}
fclose(arq);
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
13 / 18
Acesso direto
Acesso direto
Em arquivos binários, podemos acessar um dado diretamente
Para isso, movemos o ponteiro do arquivo para a posição correta
Somamos o tamanho de todos os dados armazenados antes no arquivo
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
8
...
35 36 37 38
char nome[30];
Posição de nome no arquivo: sizeof(ra) + sizeof(telefone) = 4 + 4 = 8.
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
14 / 18
Acesso direto
Acesso direto
Em arquivos binários, podemos acessar um dado diretamente
Para isso, movemos o ponteiro do arquivo para a posição correta
Somamos o tamanho de todos os dados armazenados antes no arquivo
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
8
...
35 36 37 38
char nome[30];
Posição de nome no arquivo: sizeof(ra) + sizeof(telefone) = 4 + 4 = 8.
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
14 / 18
Acesso direto
Acesso direto
Em arquivos binários, podemos acessar um dado diretamente
Para isso, movemos o ponteiro do arquivo para a posição correta
Somamos o tamanho de todos os dados armazenados antes no arquivo
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
8
...
35 36 37 38
char nome[30];
Posição de nome no arquivo: sizeof(ra) + sizeof(telefone) = 4 + 4 = 8.
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
14 / 18
Acesso direto
Acesso direto
Em arquivos binários, podemos acessar um dado diretamente
Para isso, movemos o ponteiro do arquivo para a posição correta
Somamos o tamanho de todos os dados armazenados antes no arquivo
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
8
...
35 36 37 38
char nome[30];
Posição de nome no arquivo: sizeof(ra) + sizeof(telefone) = 4 + 4 = 8.
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
14 / 18
Acesso direto
Acesso direto
Em arquivos binários, podemos acessar um dado diretamente
Para isso, movemos o ponteiro do arquivo para a posição correta
Somamos o tamanho de todos os dados armazenados antes no arquivo
Arquivo
0
1
2
int ra;
3
4
5
6
7
int telefone;
8
...
35 36 37 38
char nome[30];
Posição de nome no arquivo: sizeof(ra) + sizeof(telefone) = 4 + 4 = 8.
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
14 / 18
Posicionando o ponteiro de arquivo
Para posicionar o ponteiro de um arquivo, usamos a função
Função de posicionamento
fseek(FILE *arq, int posicao, int posicao_origem);
Parâmetros da fseek
arq: referência para o arquivo
posicao: posição do ponteiro de arquivo
posicao_origem: indica a posição de origem do deslocamento:
I
I
I
SEEK_SET, a partir do início
SEEK_CUR, a partir da posição atual
SEEK_END, a partir do final de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
15 / 18
Posicionando o ponteiro de arquivo
Para posicionar o ponteiro de um arquivo, usamos a função
Função de posicionamento
fseek(FILE *arq, int posicao, int posicao_origem);
Parâmetros da fseek
arq: referência para o arquivo
posicao: posição do ponteiro de arquivo
posicao_origem: indica a posição de origem do deslocamento:
I
I
I
SEEK_SET, a partir do início
SEEK_CUR, a partir da posição atual
SEEK_END, a partir do final de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
15 / 18
Posicionando o ponteiro de arquivo
Para posicionar o ponteiro de um arquivo, usamos a função
Função de posicionamento
fseek(FILE *arq, int posicao, int posicao_origem);
Parâmetros da fseek
arq: referência para o arquivo
posicao: posição do ponteiro de arquivo
posicao_origem: indica a posição de origem do deslocamento:
I
I
I
SEEK_SET, a partir do início
SEEK_CUR, a partir da posição atual
SEEK_END, a partir do final de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
15 / 18
Posicionando o ponteiro de arquivo
Para posicionar o ponteiro de um arquivo, usamos a função
Função de posicionamento
fseek(FILE *arq, int posicao, int posicao_origem);
Parâmetros da fseek
arq: referência para o arquivo
posicao: posição do ponteiro de arquivo
posicao_origem: indica a posição de origem do deslocamento:
I
I
I
SEEK_SET, a partir do início
SEEK_CUR, a partir da posição atual
SEEK_END, a partir do final de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
15 / 18
Posicionando o ponteiro de arquivo
Para posicionar o ponteiro de um arquivo, usamos a função
Função de posicionamento
fseek(FILE *arq, int posicao, int posicao_origem);
Parâmetros da fseek
arq: referência para o arquivo
posicao: posição do ponteiro de arquivo
posicao_origem: indica a posição de origem do deslocamento:
I
I
I
SEEK_SET, a partir do início
SEEK_CUR, a partir da posição atual
SEEK_END, a partir do final de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
15 / 18
Posicionando o ponteiro de arquivo
Para posicionar o ponteiro de um arquivo, usamos a função
Função de posicionamento
fseek(FILE *arq, int posicao, int posicao_origem);
Parâmetros da fseek
arq: referência para o arquivo
posicao: posição do ponteiro de arquivo
posicao_origem: indica a posição de origem do deslocamento:
I
I
I
SEEK_SET, a partir do início
SEEK_CUR, a partir da posição atual
SEEK_END, a partir do final de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
15 / 18
Posicionando o ponteiro de arquivo
Para posicionar o ponteiro de um arquivo, usamos a função
Função de posicionamento
fseek(FILE *arq, int posicao, int posicao_origem);
Parâmetros da fseek
arq: referência para o arquivo
posicao: posição do ponteiro de arquivo
posicao_origem: indica a posição de origem do deslocamento:
I
I
I
SEEK_SET, a partir do início
SEEK_CUR, a partir da posição atual
SEEK_END, a partir do final de arquivo
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
15 / 18
Acessando uma posição de um arquivo de inteiros
#define NUM_VALORES 100
int main() {
FILE *arq;
int i, valor;
arq = fopen("inteiros.bin", "r+b");
printf("Digite a posição desejada e o valor: ");
scanf("%d%d", &i, &valor);
if (i >= NUM_VALORES) {
printf("Posição invalida");
return 1;
}
fseek(arq, i * sizeof(int), SEEK_SET);
fwrite(&valor, sizeof(int), 1, arq);
fclose(arq);
}
E se tivéssemos usado o modo de abertura "wb"?
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
16 / 18
Acessando uma posição de um arquivo de inteiros
#define NUM_VALORES 100
int main() {
FILE *arq;
int i, valor;
arq = fopen("inteiros.bin", "r+b");
printf("Digite a posição desejada e o valor: ");
scanf("%d%d", &i, &valor);
if (i >= NUM_VALORES) {
printf("Posição invalida");
return 1;
}
fseek(arq, i * sizeof(int), SEEK_SET);
fwrite(&valor, sizeof(int), 1, arq);
fclose(arq);
}
E se tivéssemos usado o modo de abertura "wb"?
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
16 / 18
Alterando um registro em um banco de dados
FILE *arq;
int i, novo_telefone;
Ficha ficha;
arq = fopen("fichas.bin", "r+b");
printf("Digite a posição e o novo telefone: ");
scanf("%d%d", &i, &novo_telefone);
fseek(arq, i * sizeof(Ficha), SEEK_SET);
fread(&ficha, sizeof(Ficha), 1, arq);
ficha.telefone = novo_telefone;
fseek(arq, i * sizeof(Ficha), SEEK_SET);
fwrite(&ficha, sizeof(Ficha), 1, arq);
fclose(f);
E se não tivéssemos lido a ficha antes de alterá-la?
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
17 / 18
Alterando um registro em um banco de dados
FILE *arq;
int i, novo_telefone;
Ficha ficha;
arq = fopen("fichas.bin", "r+b");
printf("Digite a posição e o novo telefone: ");
scanf("%d%d", &i, &novo_telefone);
fseek(arq, i * sizeof(Ficha), SEEK_SET);
fread(&ficha, sizeof(Ficha), 1, arq);
ficha.telefone = novo_telefone;
fseek(arq, i * sizeof(Ficha), SEEK_SET);
fwrite(&ficha, sizeof(Ficha), 1, arq);
fclose(f);
E se não tivéssemos lido a ficha antes de alterá-la?
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
17 / 18
Exercícios
Mesclagem de arquivos
1
Escreva um programa que leia dois arquivos de inteiros ordenados e
escreva um novo arquivo com todos os inteiros ordenados.
I
I
2
Vale a pena colocar o conteúdo dos arquivos de entrada em dois
vetores?
Escreva duas versões deste programa, uma para arquivos de texto e
outra para arquivos binários.
Escreva um programa que leia um arquivo binário de 1001 inteiros
ordenados e imprima a mediana.
I
É necessário percorrer todo o arquivo? E se fosse um arquivo de texto?
Danillo Roberto Pereira (IC-UNICAMP)
MC-102 - Arquivos binários
Primeiro Semestre de 2013
18 / 18

Documentos relacionados