Baixe o app para aproveitar ainda mais
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 }
Compartilhar