Buscar

Aula24 ArquivoEArquivoBin emC 1

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 22 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 22 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 22 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

ArquivoArquivoArquivoArquivo
Conjunto de dados armazenados em memória 
secundáriasecundária
Binário
( d )Arquivos em C (estruturado)
T tTexto
(caracteres)
[tratados como streams]
1
ArquivoArquivoArquivoArquivo
1 2 3 4
Ca Cb Cc Cd
Ca Cb Cc Cd
ARtemp0
1 2 3 4
Ca Cb Cc ...
Ca Cb Cc Cd
1 2 3 4
Ca Cb Cc ...ARtemp1
Ca Cb Cc Cd
Disco
1 2 3 4
Ca Cb Cc ...ARtemp2
• externo 
• memória secundária
Disco
Memória domemória secundária
• informações não se perdem ao 
término do programa
computador
p g
• armazenamento permanente 
das informações 2
Streams Streams Streams Streams 
• O sistema de E/S do C utiliza o conceito de 
streams.streams.
• Um stream é um dispositivo lógico (um canal 
d i l ã ) t i de manipulação) que representa um arquivo ou 
um dispositivo qualquer (monitor, teclado,etc).
• Operações sobre streams são “bufferizadas”, 
ou seja, trabalham com uma área de memória ou seja, trabalham com uma rea de mem r a 
intermediária (buffer) e não propriamente 
sobre o disco.sobre o d sco.
3
Declaração de um ArquivoDeclaração de um Arquivo
FILE *arquivo “ponteiro de ‘arquivo’”
Os streams arquivos são representados por 
uma estrutura chamada FILE definida em uma estrutura chamada FILE, definida em 
stdio.h.
• Os programa que manipulam estas streams 
usam então um apontador para esta estrutura 
(FILE *).
4
EsquemaEsquema de de utilizaçãoutilização de de arquivosarquivosqq çç qq
Abre/CriaAbre/Cr a
Descarreg
a buffer MANIPULA
Ca Cb Cc Cd
Ca Cb Cc Cd
Fecha e 
salva em 
Ca Cb Cc Cd
Ca Cb Cc Cd
Ca Cb Cc Cd
Ca Cb Cc Cdtemp
salva em 
DISCO
Disco Memória principal
Movimentação de dados
5
Movimentação de dados
Funções
ArquivoArquivoArquivoArquivo
Conjunto de DADOS armazenados em memória 
secundáriasecundária
Binário
( d )Arquivos em C (estruturado)
T t[tratados como streams] Texto
(caracteres)
[tratados como streams]
6
Arquivo Arquivo BinárioBinário
cod Nome idade salario
‘a’ “James Bond” 40 18000.00 Um registro
char char[20] int float
000111011011010101001100110111010100101000111011011010101001100110111010100101
00010101010100100100100010010010100011
10110110101010001101110101001010001010
10101001001001000100100101000111011011 Registros
01010100110011011101010010100010101010
10010010010001001001010001110110110101
...000111011011010101001100
1101110101001010001010101
01001001001000100100101
Arquivo
01001001001000100100101....
7
disco (HD)arquivos
Arquivo Arquivo BinárioBinário Ca Cb Cc CdArquivo Arquivo BinárioBinário
Ca Cb Cc Cd
• agregado de bytes
d l d d d 
Ca Cb Cc Cd
Ca Cb Cc Cd
• cada elemento pode ser um dado 
simples ou estruturado
• não tem limitação de tamanho
• comprimento do arquivo: número de
• elementos não tem nome
p q
elementos que apresenta no momento
elementos não tem nome
• somente um elemento é acessível a cada momento
→ elemento corrente→ elemento corrente
• é possível efetuar acessos randômicos 8
Arquivo Arquivo BinárioBinário
Variável buffer
Arquivo Arquivo BinárioBinário
lerCa Cb Cc Cd ler
1 2 3 4
Ca Cb Cc Cd
Ca Cb Cc Cd
gravar temp
Ca Cb Cc Cd
Ca Cb Cc Cd
Ca Cb Cc Cd
Disco
Memória principal
Dados devem ser manipulados 
na memória principal 9
Comandos de manipulaçãoComandos de manipulação
fopen (<nome do arquivo>,<modo de abertura>)
Nome do arquivo em 
disco Modo de abertura
“rb” – abre um arquivo binário para leitura
“wb” – cria/recria um arquivo binário para escritawb cria/recria um arquivo binário para escrita
“ab” – acrescenta dados ao fim de um arquivo binário existente
“r+b” – abre um arquivo binário para leitura/escritaq p
“w+b” – cria/recria um arquivo binário para leitura/escrita
“a+b” – acrescenta em/cria um arquivo binário para leitura/escrita
Abre/cria/recria um arquivo com o nome e modo passados.
Ob f ã t t d t t Ob f ã t t d t t FILEFILE!!Obs.: a função retorna um apontador para uma estrutura Obs.: a função retorna um apontador para uma estrutura FILEFILE!!
10
Comandos de manipulaçãoComandos de manipulação
fopen (<nome do arquivo>,<modo de abertura>)
Exemplo:Exemplo:ExemploExemplo
#include <stdio.h> /* contém definições e funções 
p/ uso e manipulação de streams */
#include <stdlib.h>
void main(){void main(){
FILE *arq; /* declaração da estrutura */
arq = fopen(“exemplo.bin”,”rb”); /*abertura para leitura */
if (!arq) /* retorno NULL indica erro na abertura */
printf(“Erro na abertura do arquivo.”);
} 
11
fclose (<apontador para FILE>)
F h d iFecha um stream de arquivo
Obs.: ao fechar o stream do arquivo todos os dados
que ainda estavam em buffer serão salvos em discoque ainda estavam em buffer serão salvos em disco.
Ex:Ex: ...FILE *arq;FILE arq;
arq = fopen(“exemplo.bin”,”rb”); 
if (!arq)
printf(“Erro na abertura do arquivo.”);
...
fclose(arq); /* fecha o arquivo */
...
fflush (<apontador para FILE>)p p
Descarrega o conteúdo em buffer para o arquivo
sem fechar o streamsem fechar o stream.
12
fread (<&varbuffer>,<numbytes>,<quant>,<FILE *>)( , y , q , )
Lê dados do arquivo para a memória principal
• lê o dado a partir do elemento corrente e o armazena em 
varbuffer;varbuffer;
• numbytes é o tamanho da unidade a ser lida, quant indica 
quantas unidades daquela serão lidas. Logo o número total de q q g
bytes que poderão ser lidos é igual a numbytes*quant;
• varbuffer pode ser do mesmo tamanho que numbytes ou 
óum ponteiro para uma região da memória;
• retorna a quantidade efetivamente lida que poderá ser 
menor que o solicitado se o final do arquivo for alcançado menor que o solicitado se o final do arquivo for alcançado 
previamente.
fwrite (<&varbuffer>,<numbytes>,<quant>,<FILE *>)( , y , q , )
Grava dados no arquivoGrava dados no arquivo
 f i t é i il t i ó it• o funcionamento é similar a anterior, só que para escrita;
• retorna a quantidade efetivamente escrita se não houver 
erros
14
ExemploExemplopp
...
FILE *arq;
float pi = 3.1415;
float piLido;float piLido;
if ((arq = fopen(“exemplo.bin”,“wb”)) == NULL)
{
printf(“Erro na abertura!”);
// Interage com usuário para tratar erro// Interage com usuário para tratar erro 
}
else 
{ if (fwrite(&pi,sizeof(float),1,arq) != 1)
printf(“Erro na escrita!”);printf( Erro na escrita! );
fclose(arq);
}
if ((arq = fopen(“exemplo.bin”,“rb”)) == NULL)
{{
printf(“Erro na abertura!”);
}
else 
{ if(fread(&piLido,sizeof(float),1,arq) != 1){ ( ( p , ( ), , q) )
printf(“Erro na leitura!”);
else 
{printf(“\nO valor de PI, lido do arquivo e’: %f”,piLido);
fclose(arq);
}
...
15
Funções sobre arquivosFunções sobre arquivos
feof (<FILE *>)
Indica se um arquivo chegou ao fimq g
Retorna verdadeiro (não-zero) caso o final foi atingido, falso 
(zero) caso contrário.
ferror(<FILE *>)
Indica se a última operação com um arquivo produziu um erroIndica se a última operação com um arquivo produziu um erro
Cada nova operação com o arquivo modifica a condição de 
erro.
...
FILE *arq;
...
...
FILE *arq;
float piLido;
while(!feof(arq)){ /* Enquanto
não for o fim faça... */
...
}
p ;
arq = fopen(...,“rb”);
...
fread(&piLido,...,...,arq);
if(ferror(arq))
16
}
...
...
if(ferror(arq))
printf(“Erro na Leitura!”);
...
...
ExercíciosExercícios• Faça um programa para gravar um arquivo composto Faça um programa para gravar um arquivo composto 
por estruturas que contenham Nome, Idade e Altura 
de atletas
• outro para listar um arquivo com estas estruturas
• um terceiro para imprimir a Altura de um 
determinado atleta cujo nome foi lido do tecladodeterminado atleta, cujo nome foi lido do teclado
• outro que insere um novo registro no final do arquivo
• e por fim um para alterar a idade de um determinado 
atleta cujo nome foi lido do teclado
17
atleta, cujo nome foi lido do teclado
Definições necessáriasDefinições necessárias
#include <stdio.h> /*biblioteca com as definições
necessárias*/
FILE *arq; /*declaração global 
de um “ponteiro de arquivo”*/
typedef struct { /*declaração da estrutura utilizada*/
char Nome[30];
int Idade;
float Altura;float Altura;
} ATLETA;
...
int main(){
/*a função principal se encarrega... /*a função principal se encarrega 
de chamar as demais funções a partir
da interação com o usuário*/
}
18
}
1. Um programa para gravar um arquivo com Nome, Idade 
e Altura de atletas
void criaInsere()void criaInsere()
{
ATLETA buffer;
char nome[15]; 
printf("Nome do arquivo: ");
scanf("%s",&nome);
if(!(arq = fopen(nome,“wb")))
{ /*abre pra leitura*/{ /*abre pra leitura*/
printf("Erro criacao ");
}
else
{
do{ /*coleta dados do usuário e os escreve*/
printf("\nNome: ");
scanf("%s" &buffer Nome);scanf( %s ,&buffer.Nome);
printf("\nIdade: ");
scanf("%d",&buffer.Idade);
printf("\nAltura: ");
scanf("%f",&buffer.Altura);
fwrite(&buffer,sizeof(struct Atleta),1,arq);
printf("\n1-InserirNovo, 2-Encerrar\n");
op = (char)getch();
19
op = (char)getch();
} while(op != '2');
fclose(arq); /*fecha*/
}// fim do else
2. Lista um arquivo de atletas
void listaArquivo()
{{
ATLETA buffer;
char nome[15]; 
printf("Nome do arquivo: ");
f("% " )scanf("%s",&nome);
if(!(arq = fopen(nome,"rb")))
{ /*abre pra leitura*/
printf("Erro abertura");printf( Erro abertura );
}
else
{ printf("-----Comeco da listagem-----\n");
hil (!f f( ))while(!feof(arq))
{ /*até o fim do arquivo...*/
if(fread(&buffer,sizeof(ATLETA),1,arq) == 1)
{/*faz a leitura e confirma se o que foi lido é{/ faz a leitura e confirma se o que foi lido é
realmente uma estrutura, então imprime*/
printf("Nome: %s\n",buffer.Nome);
printf("Idade: %d\n",buffer.Idade);
i tf("Alt % 2f\ \ " b ff Alt )printf("Altura: %.2f\n\n",buffer.Altura);
}
}
printf("-----Fim da listagem-----\n");
20
p t ( da stage \ );
fclose(arq); 
}// fim do else
}
3. Imprimir altura de atleta procurado
void consultaAltura()
{ i t t d 0 t d 0{ int encontrado = 0, contador = 0;
ATLETA buffer;
char nome[15], procurado[30]; 
printf("Nome do arquivo: ");
scanf("%s",&nome);
if(!(arq = fopen(nome,"rb")))
printf("Erro abertura");
else 
{ printf("Nome do procurado: ");
scanf("%s",&procurado);
while(!feof(arq))
{ if(fread(&buffer,sizeof(struct Atleta),1,arq) == 1)q
if(!(strcmp(buffer.Nome,procurado)))
{ /*compara*/
printf("\nAltura do procurado: %.2f",buffer.Altura);
encontrado = 1; /*verdade, alguém foi encontrado*/; / , g /
contador++;
}
}
if (!encontrado)if (!encontrado)
printf("\nNenhum atleta encontrado");
else
printf("\nOcorrencias encontradas: %d",contador);
fclose(arq);
21
fclose(arq); 
} // Fim do else 
} 
4. Inserção no fim do arquivo
void insereFim()
{{
ATLETA buffer;
char nome[15]; 
char op; p
printf("Nome do arquivo: ");
scanf("%s",&nome);
if(!(arq = fopen(nome,“ab")))
{ /*abre para acrescentar dados */{ /*abre para acrescentar dados */
printf("Erro criacao ");
}
else
{do{
printf("\nNome: ");
scanf("%s",&buffer.Nome);
printf("\nIdade: ");printf("\nIdade: ");
scanf("%d",&buffer.Idade);
printf("\nAltura: ");
scanf("%f",&buffer.Altura);
fwrite(&buffer,sizeof(struct Atleta),1,arq);
printf("\n1-InserirNovo, 2-Encerrar\n");
op = (char)getch();
} while(op != '2');
22
} while(op != 2 );
fclose(arq); 
} // Fim do else
}

Materiais relacionados

Perguntas relacionadas

Materiais recentes

Perguntas Recentes