Baixe o app para aproveitar ainda mais
Prévia do material em texto
Manipulação de Arquivos Um arquivo é interpretado pela linguagem C/C++ como qualquer dispositivo de entrada e saída (E/S), desde um arquivo em disco até uma impressora. Dentre os arquivos em disco, existem dois tipos: Texto (caracteres) e Binário (bytes). Para utilizar um arquivo, é preciso associá-lo a uma variável lógica e, então, manipulá-la. A associação ocorre na operação de abertura do arquivo. Operações básicas em um arquivo: Leitura (consulta) de um dado. Gravação (inclusão) de um dado. Ponteiro de Arquivo O ponteiro de arquivo serve para referenciar o arquivo a ser tratado pelo programa. O ponteiro não aponta diretamente para o arquivo; contém as seguintes informações sobre o mesmo: nome, situação (aberto ou fechado) e posição atual sobre o arquivo. Para se definir uma variável ponteiro de arquivo, usa-se a seguinte declaração: FILE *Arquivo; Desta forma, passa a existir uma variável de nome Arquivo que será o ponteiro de um arquivo a ser criado ou aberto. Abrindo um arquivo A função fopen() abre um arquivo. Para tanto, devem ser passados o nome físico do arquivo e o modo de abertura. Caso o arquivo possa ser aberto, retorna um ponteiro referente; caso contrário, retorna NULL (nulo). Além do modo de escrita, a linguagem C permite o uso de alguns valores padronizados para o modo de manipulação de arquivos, conforme mostra a tabela abaixo: � Fechando um Arquivo Para o esvaziamento da memória de um arquivo é utilizada a função fclose()que associa-se diretamente ao nome lógico do arquivo: fclose (Arquivo); Gravando e lendo Dados em Arquivos Existem várias funções em C para a operação de gravação e leitura de dados em arquivos. Abaixo seguem algumas: putc() ou fputc() Grava um único caractere no arquivo. Sintaxe: Grava o conteúdo da variável caractere no arquivo. � putc (caractere, arquivo) ou fputc (caractere, arquivo) ; #include <stdio.h> main() { FILE *fp; char caractere; fp=fopen ("nomes.txt","w"); if (fp != NULL) for(int i=0; i<10; i++) { printf("Entre com o caractere "); scanf("%c",&caractere); fflush(stdin); putc(caractere,fp); } fclose(fp); } fgetc() Lê um caractere em um arquivo. Sintaxe: fgetc (arquivo); #include <stdio.h> main ( ) { FILE *arq; //declaração do arquivo char ch; if ((arq = fopen("nomes.txt","r")) == NULL) { printf("Erro na abertura do arquivo\n"); } ch = getc(arq); //lê o 1o caractere do arquivo while (ch != EOF) { //varre o arquivo � printf("%c \n",ch); //imprime na tela o caractere lido ch = getc(arq); //lê o próximo caractere } fclose (arq); //fecha o arquivo } fprintf() Grava dados formatados no arquivo, de acordo com o tipo de dados (float, int, ...). Similar ao printf, porém ao invés de imprimir na tela, grava em arquivo. Sintaxe: fprintf(arquivo, "formatos", var1, var2 ...); #include <stdio.h> main() { FILE *fp; char nome[50]; fp=fopen ("nomes.txt","w"); if (fp != NULL) for(int i=0; i<10; i++) { printf("Escreva um nome: "); scanf("%[^\n]s",nome); fflush(stdin); fprintf(fp, "Nome %d: %s\n", i+1, nome); } fclose(fp); } fwrite() Grava um conjunto de dados heterogêneos (struct) no arquivo. Sintaxe: � fwrite (buffer, tamanhoembytes, quantidade, ponteirodearquivo); � *O buffer é um endereço de memória da estrutura de onde devem ser escritos os valores *O tamanhoembytes é um valor numérico que define o número de bytes da estrutura que deve ser escrita *A quantidade é o número de estruturas que devem ser escritas em cada processo de fwrite * O ponteirodearquivo é o ponteiro do arquivo de onde deve ser escrita uma estrutura. #include <stdio.h> struct reglivro { char titulo[30]; int codlivro; int qtde; } ; int main ( ) { FILE *arq; reglivro livro; char opcao; if ((arq = fopen("livros1.txt","w")) == NULL) { printf("Erro na criação do arquivo\n"); } do { printf( "Titulo : "); scanf("%s",&livro.titulo) ; printf("Codigo: "); scanf("%d",&livro.codlivro); printf("Qtde Estoque : "); scanf("%d",&livro.qtde); fwrite (&livro, sizeof(livro), 1, arq); printf("Adiciona outro livro (S/N)? "); fflush(stdin); scanf("%c",&opcao); } while (opcao == 'S'); } � fread() A função pode ler qualquer tipo de dado e não apenas caracteres ou cadeias de caracteres. Sintaxe: fread (buffer, tamanhoembytes, quantidade, ponteirodearquivo); *O buffer é um endereço de memória da estrutura de onde deve ser lido *O tamanhoembytes é um valor numérico que define o número de bytes da estrutura que deve ser lida *A quantidade é o número de estruturas que devem ser lidas em cada processo de fread *O ponteiro de arquivo ponteirodearquivo é o ponteiro do arquivo de onde deve ser lida #include <stdio.h> struct reglivro { char titulo[30]; int codlivro; int qtde ; } ; int main ( ) { FILE *arq; reglivro livro; char opcao; if ((arq = fopen("livros1.txt","r")) == NULL) { printf("Erro na criação do arquivo\n"); } while (fread(&livro, sizeof(livro), 1, arq) == 1) { printf( "Titulo: %s\n ", livro.titulo); printf( "Codigo: %d\n ", livro.codlivro); printf( "Qtde: %d\n ", livro.qtde); printf("\n"); } fclose (arq);} ********************************************************************** #include <stdio.h> struct reglivro { char titulo[30],achou; int codlivro; int qtde ; � } ; int main ( ) { FILE *arq; reglivro livro; char achou;int codigo; if ((arq = fopen("livros1.txt","r")) == NULL) { printf("Erro na criação do arquivo\n"); } printf("Entre com o codigo do livro "); scanf("%d",&codigo); achou='F'; while (fread(&livro, sizeof(livro), 1, arq) == 1) { if (livro.codlivro==codigo){ printf( "Titulo: %s\n ", livro.titulo); printf( "Codigo: %d\n ", livro.codlivro); printf( "Qtde: %d\n ", livro.qtde); achou='V'; printf("\n"); � } } if (achou=='F') printf("Livro não encontrado !!!") � ; � fclose (arq);} Posicionando em um registro Por meio da linguagem C não é possível saber qual é a posição de cada registro no arquivo. Em outras linguagens, a movimentação em registros é feita por meio de funções que fazem a leitura da linha do registro. Em C esta posição pode ser calculada pelo tamanho do registro. Não é possível, como em outras linguagens, pedir para que se posicione no segundo, terceiro ou último registro Para isso, programador em C deve saber o tamanho em bytes de cada registro, e posicionar-se de acordo com este tamanho. � A função fseek(), apresentada logo abaixo movimenta-se de byte em byte seek(<referência_ao_arquivo>, <n>, <modo>); O parâmetro <n> indica quantos bytes devem ser avançados ou retrocedidos a função sizeof() é uma função auxiliar que indica quantos bytes possui o registro a ser inserido (ou a estrutura definida para o registro) O parâmetro <modo> apresenta três opções: SEEK_SET - Parte do início do arquivo e avança <n> bytes SEEK_END - Parte do final do arquivo e retrocede <n> bytes SEEK_CUR - Parte do local atual e avança <n> bytes #include <stdio.h> struct reglivro { char titulo[30]; int codlivro; int qtde; } ; main ( ) { FILE *arq; reglivro livro; int codigo; if ((arq = fopen("livros1.txt","r")) == NULL) { printf("Erro na criação do arquivo\n"); } printf("Entre com o registro desejado "); scanf("%d",&codigo);fseek(arq, (codigo-1)*sizeof(livro),SEEK_SET) ; fread(&livro, sizeof(livro), 1, arq); printf( "Titulo: %s\n ", livro.titulo); printf( "Codigo: %d\n ", livro.codlivro); printf( "Preço: %d\n ", livro.qtde); printf("\n"); fclose (arq); } � #include <stdio.h> struct reglivro { char titulo[30]; int codlivro; int qtde; } ; main ( ) { FILE *arq; reglivro livro; int tamanho,codigo; if ((arq = fopen("livros1.txt","r")) == NULL) { printf("Erro na criação do arquivo\n"); } printf("Entre com o registro desejado "); scanf("%d",&codigo); fseek (arq, 0, SEEK_END); tamanho = ftell (arq); // A função ftell() retorna a posição corrente do ponteiro de um arquivo binário, ou seja, o número de bytes desde o início do arquivo if ((codigo-1)*sizeof(livro)<tamanho){ fseek(arq, (codigo-1)*sizeof(livro),SEEK_SET) ; fread(&livro, sizeof(livro), 1, arq); printf( "Titulo: %s\n ", livro.titulo); printf( "Codigo: %d\n ", livro.codlivro); printf( "Preço: %d\n ", livro.qtde); printf("\n"); } else printf("Registro Inexiste"); fclose (arq); }
Compartilhar