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