Buscar

Manipulacao Arquivo C

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 3, do total de 9 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

Você também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 6, do total de 9 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

Você também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 9, do total de 9 páginas

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);
}

Continue navegando