Você está na página 1de 4

Funes de Manipulao de arquivo

A principio as informaes que os programas utilizam so perdidas quando eles so finalizados ou quando o computador desligado. Isso porque as variveis de um programa ficam armazenadas na memria primria, que voltil, isto , perde seu contedo. Quando voc no quer perder as informaes de seu programa, tendo-as a mo para a sua prxima execuo, voc deve guard-las em um arquivo. Os arquivos so estruturas especiais que ficam armazenadas na memria secundria do computador (disquete, disco rgido...) e que servem para guardar as informaes enquanto um programa no est em execuo, pois elas no so volteis. O processo de utilizao de um arquivo envolve, no mnimo, trs etapas: criao ou abertura do arquivo, gravao ou leitura de dados no arquivo e fechamento do arquivo. Na primeira etapa, se o arquivo ainda no existir na memria secundria, ele deve ser criado. Caso o arquivo j existir (pelo fato de ter sido criado em uma execuo anterior do programa) ele pode ser aberto para que novos dados sejam acrescentados ou para que os dados guardados nele possam ser lidos. Os arquivos podem ser de dois tipos: tipo texto e tipo binrio. A escolha se um arquivo texto ou binrio depende do tipo de sua aplicao. Se voc for armazenar textos para serem lidos em outro lugar (como um editor de texto ou um relatrio), voc deve utilizar um arquivo do tipo texto. Se voc for armazenar dados sobre alguma pessoa ou objeto (tipo registro ou estrutura), voc deve utilizar um arquivo binrio, pois, alm de ocupar menos espao no armazenamento das informaes, ele as protege um pouco de outros programas bisbilhoteiros. A segunda etapa a que efetivamente l ou grava dados no arquivo. A linguagem C oferece funes especficas de leitura e de escrita de dados em um arquivo. Se o arquivo for do tipo texto (como este que voc est lendo), voc deve utilizar funes especficas para arquivos-texto. Se ele for binrio (do tipo que armazena registros ou estruturas), voc deve utilizar as funes de leitura e/ou escrita em arquivos binrios. A terceira etapa consiste em fechar o arquivo, para que seus dados sejam efetivamente gravados e fiquem protegidos at que o arquivo seja aberto novamente. Vamos agora ver em detalhes cada uma destas etapas e as funes envolvidas nelas.

Etapa I: Abrindo ou criando um arquivo


O arquivo representado na memria secundria por um nome e uma extenso. So exemplos: Apresentao.ppt, autoexec.bat e Trabalho.doc. Porm, dentro da linguagem C, os arquivos no podem ser manipulados diretamente. Eles precisam representados (referenciados, na verdade) por uma varivel do tipo FILE*. Logo, sempre que voc for utilizar um arquivo crie uma varivel do tipo FILE* para poder utiliz-lo. Todas as funes de manipulao de arquivo necessitam de uma varivel deste tipo para poder manipular esse arquivo. Declarar uma varivel deste tipo fcil. Veja:
FILE* arquivo; // cria uma varivel que manipula arquivos

Depois de ter declarado uma varivel que vai representar o arquivo, voc deve efetivamente tentar abrir ou criar o arquivo. Isso feito com a funo fopen. Porm, antes de usar a funo fopen, voc deve decidir se vai abrir ou criar o arquivo (isso vai depender de ele j existir ou no na memria secundria) e tambm deve decidir se ele vai ser um arquivo do tipo texto ou do tipo binrio. Dependendo da sua escolha, a fopen vai ser chamada de uma forma ou de outra, com parmetros diferentes que indicam as escolhas que voc tomou. Sintaxe de utilizao de fopen
Varivel do tipo FILE*, que vai servir para representar o arquivo dentro do programa. Modos possveis: r abrir w criar/sobrescrever

varivel = fopen(nome_arquivo.extenso, modo+tipo);

Nome do arquivo, tal qual ele existe (ou vai existir) na memria secundria.

Tipos possveis: t texto b binrio

Logo, para abrir um arquivo o modo deve ser r, e para criar um arquivo (ou sobrescrever um j existente) o modo deve ser w. Tome muito cuidado com o modo w, pois todos os dados de um arquivo so apagados, caso ele j exista.

Veja os exemplos: Abrindo um arquivo do tipo texto


arquivo = fopen(teste.txt, r+t);

Etapa II: lendo ou gravando dados no arquivo


Depois de ter aberto ou criado um arquivo, e ter uma varivel que o represente dentro do programa, voc pode comear a gravar ou a ler dados neste arquivo. Gravando em arquivos-texto

Criando um arquivo do tipo texto


arquivo = fopen(teste.txt, w+t);

Para gravar, utilize a funo fprintf, que muito parecida com a funo printf. A nica diferena que h um parmetro (o primeiro) indicando qual o arquivo onde os dados sero gravados (ou melhor, impressos):
int idade = 20; fprintf(arquivo, Essa frase vai ser gravada no arquivo\n); fprintf(arquivo, %d, idade); // grava a idade no arquivo fprintf(arquivo, %s tem %d anos\n, Leo, idade); // ^^^^^^^^^^^^^ grava Leo tem 20 anos

Note que a nica coisa que muda nestes dois exemplos o modo, que no primeiro caso r e no segundo w. Se voc desejar manipular um arquivo do tipo binrio, deve substituir o t do tipo por um b: Abrindo um arquivo do tipo binrio
arquivo = fopen(teste.txt, r+b);

Voc tambm pode utilizar fprintf para gravar os dados de uma estrutura, mas seus campos tm que ser gravados um-a-um e sero gravados no formato texto:
struct tipoEndereco{ char rua[30]; int numero; } endereco; : fprintf(arquivo, %s %d\n, endereco.nome, endereco.numero);

Criando um arquivo do tipo binrio


arquivo = fopen(teste.txt, w+b);

Lendo a partir de arquivos-texto OBS: Antes de seguir em frente, voc deve testar se o arquivo foi realmente aberto ou criado. Isso porque as demais funes de manipulao de arquivo no funcionaro se a funo fopen no tiver funcionado. Para saber se a funo fopen realmente criou ou abriu o arquivo que voc solicitou, teste se a varivel que representa o arquivo (a varivel arquivo, no exemplo) possui algum valor dentro dela. Se ela no possuir um valor (se ele for NULL) porque o arquivo no foi aberto ou criado:
if(arquivo!=NULL)//S entra aqui se o arquivo foi aberto/criado { // coloque as funes de manipulao de arquivo aqui dentro }

Para ler, utilize a funo fscanf, que muito parecida com a funo scanf. A nica diferena que h um parmetro (o primeiro) indicando qual o arquivo de onde os dados sero lidos:
int idade; char nome[20]; fscanf(arquivo, %d, &idade); // L uma idade do arquivo fscanf(arquivo, %s %d, nome, &idade); // ^^^^^ L nome e idade separados por um espao

Posicionando-se em um arquivo binrio OBS: Antes de ler ou gravar dados em arquivos binrios, importante se posicionar no local correto. Quando um arquivo aberto, voc fica posicionado na primeira posio do mesmo. Caso voc queira fazer uma leitura em outra posio, deve-se posicionar corretamente. Da mesma forma, se voc desejar gravar alguma coisa, deve-se posicionar no final do arquivo para que os dados existentes nele no sejam substitudos (veja posicionando-se em um arquivo binrio). Gravando em arquivos-binrios Para gravar, utilize a funo fwrite, que grava estruturas inteiras de uma nica vez:
struct tipoEndereco{ char rua[30]; int numero; int apartamento; }; tipoEndereco endereo; char nome[20]; strcpy(nome, Laura); strcpy(endereco.rua, Lima e Silva); endereco.numero = 1047; endereco.apartamento = 215; fwrite(&nome, sizeof(nome), 1, arquivo); // ^^^^ grava o nome no arquivo fwrite(&endereco, sizeof(endereco), 1, arquivo); // ^^^^^^^^ grava toda a estrutura do tipoEndereco

Para se posicionar em um arquivo, utilize a funo fseek. Aconselha-se que voc sempre se posicione no local correto antes de ler ou gravar qualquer dado.
// Utiliza as mesmas variveis do exemplo anterior: fseek(arquivo, 0, SEEK_END); // posiciona-se no final do arquivo fwrite(&endereco, sizeof(endereco), 1, arquivo); // grava fseek(arquivo, 0, SEEK_SET); // posiciona-se no incio do arquivo fread(&endereco, sizeof(endereco), 1, arquivo); // l o registro // posiciona-se no segundo registro: fseek(arquivo, 2*sizeof(endereo), SEEK_SET); // obs: sizeof retorna o tamanho do registro! fread(&endereco, sizeof(endereco), 1, arquivo); // l o registro

OBS: Quando voc l ou grava alguma coisa do arquivo, automaticamente voc colocado na prxima posio do mesmo (prxima linha, em arquivostexto ou prximo registro, em arquivos-binrios).

Etapa III: Fechando um arquivo


Para fechar um arquivo basta chamar a funo fclose:
fclose(arquivo);

Lendo a partir de arquivos-binrios Para ler, utilize a funo fread, que muito semelhante com a funo fwrite:
// Utiliza as mesmas variveis do exemplo anterior: fread(&nome, sizeof(nome), 1, arquivo); fread(&endereco, sizeof(endereco), 1, arquivo); printf(%s mora na rua %s, numero %d, apartamento %d.\n, nome, endereco.rua, endereco.numero, endereco.apartamento);

Alguns algoritmos de manipulao de arquivos


Incluso
1) 2) 3) Tentar abrir o arquivo Se o arquivo no existir, criar um novo arquivo Se o arquivo foi aberto ou criado: a. Ler os dados a serem gravados no arquivo b. Posicionar-se no final do arquivo (ou no primeiro local vago) c. Gravar os dados no arquivo d. Voltar para (a) enquanto existirem dados a serem gravados e. Fechar o arquivo

Consulta
1) 2) 3) Tentar abrir o arquivo Se o arquivo no existir, informar que no h o que consultar e sair Se o arquivo foi aberto: a. Posicionar-se no inicio do arquivo b. Ler a chave de consulta (o campo a ser consultado) c. Ler o registro atual do arquivo em uma varivel de memria d. Se o registro atual for igual ao requisitado na chave de consulta i. Mostrar os dados na tela e. Posicionar-se no prximo registro f. Se no chegou ao final do arquivo, voltar ao passo (b) g. Fechar o arquivo

Excluso
Semelhante consulta, porm o passo (d) deve ser modificado da seguinte forma: d. Se o registro atual for igual ao requisitado na chave de consulta i. Mostrar os dados na tela ii. Perguntar se ele realmente deve ser excludo e, caso positivo, posicionar-se na posio onde o registro foi lido e regrav-lo em branco ou utilizar alguma espcie de marca de excluso

Alterao
Semelhante consulta, porm o passo (d) deve ser modificado da seguinte forma: d. Se o registro atual for igual ao requisitado na chave de consulta i. Mostrar os dados na tela ii. Solicitar ao usurio que altere os dados desejados iii. Confirmar se as alteraes esto corretas e, caso positivo, posicionar-se na posio onde o registro foi lido e regrav-lo com as alteraes.

Você também pode gostar