Você está na página 1de 22

Introduo

Manipulao de arquivos em C

Estrutura de Dados II Prof Jairo Francisco de Souza

Manipulao de Arquivo em C

Existem dois tipos possveis de acesso a arquivos na linguagem C : sequencial (lendo um registro aps o outro) e aleatrio (posicionando-se diretamente num determinado registro) Os arquivos em C so denominados ST E!" #m ST E!" $ associado a um arquivo por uma opera%o de a&ertura do arquivo e' a partir da associa%o' todas as demais opera%(es de escrita e leitura podem ser reali)adas

Manipulao de Arquivo em C

! ta&ela a&aixo apresenta as principais *un%(es da linguagem C para manipula%o de arquivos


Funo Ao Abre um arquivo Fecha um arquivo Escreve um caractere em um arquivo L um caractere de um arquivo Posiciona em um registro de um arquivo Efetua impresso formatada em um arquivo Efetua leitura formatada em um arquivo Verifica o final de um arquivo Escreve tipos maiores que 1 byte em um arquivo L tipos maiores que 1 byte de um arquivo

fopen() Fclose () putc() e fputc() getc() e fgetc() fseek() fprintf() fscanf() feof() fwrite() fread()

Manipulao de Arquivo em C

O sistema de entrada e sada do !+S, C' sendo composto por uma s$rie de *un%(es' cu-os prottipos esto reunidos em stdio./ Todas as *un%(es relacionadas anteriormente tra&al/am com o conceito de ponteiro de arquivo' sendo de*inido usando o comando t0pede* Esta de*ini%o tam&$m est1 no arquivo stdio./' e um ponteiro de arquivo pode ser declarado da seguinte maneira:

FILE

*Arquivo;

Manipulao de Arquivo em C

2ela declara%o do ponteiro anterior' passa a existir uma vari1vel de nome !rquivo' que $ ponteiro para um arquivo a ser manipulado O ponteiro de arquivo une o sistema de E3S a um &u**er e no aponta diretamente para o arquivo em disco' contendo in*orma%(es so&re o arquivo' incluindo nome' status (a&erto' *ec/ado e outros) e posi%o atual so&re o arquivo

Abrindo um Arquivo

! *un%o que a&re um arquivo em C $ a *un%o fopen()' que devolve o valor +#44 (nulo) ou um ponteiro associado ao arquivo' devendo ser passado para *un%o o nome *sico do arquivo e o modo como este arquivo deve ser a&erto

Arquivo = fopen ("texto.txt","w");

Abrindo um Arquivo

5e acordo com a instru%o anterior' est1 sendo a&erto um arquivo de nome 6texto.txt7' /a&ilitado apenas para escrita (8-8rite) 2or exemplo' pode-se codi*icar a instru%o de a&ertura de arquivo da seguinte maneira:

if ((Arquivo = fopen("texto.txt","w")) == NULL) { printf("\n Arquivo TEXTO.TXT no pode er !"erto # TE$%E A%&O"); 'et()(); *

Abrindo um Arquivo

Modo r $ a rb $b ab r2 $2 a2 r2b $2b a2b Significado

!l$m do modo de escrita' a linguagem C permite o uso de alguns valores padroni)ados para o modo de manipula%o de arquivos' con*orme mostra a ta&ela a&aixo:

Abre um arquivo te!to para leitura" # arquivo deve e!istir antes de ser aberto" Abrir um arquivo te!to para grava%o" &e o arquivo no e!istir' ele ser( criado" &e )( e!istir' o conte*do anterior ser( destru+do" Abrir um arquivo te!to para grava%o" #s dados sero adicionados no fim do arquivo , append -' se ele )( e!istir' ou um novo arquivo ser( criado' no caso de arquivo no e!istente anteriormente" Abre um arquivo bin(rio para leitura" .gual ao modo r anterior' s/ que o arquivo 0 bin(rio" 1ria um arquivo bin(rio para escrita' como no modo $ anterior' s/ que o arquivo 0 bin(rio" Acrescenta dados bin(rios no fim do arquivo' como no modo a anterior' s/ que o arquivo 0 bin(rio" Abre um arquivo te!to para leitura e grava%o" # arquivo deve e!istir e pode ser modificado" 1ria um arquivo te!to para leitura e grava%o" &e o arquivo e!istir' o conte*do anterior ser( destru+do" &e no e!istir' ser( criado" Abre um arquivo te!to para grava%o e leitura" #s dados sero adicionados no fim do arquivo se ele )( e!istir' ou um novo arquivo ser( criado' no caso de arquivo no e!istente anteriormente" Abre um arquivo bin(rio para leitura e escrita" # mesmo que r2 acima' s/ que o arquivo 0 bin(rio" 1ria um arquivo bin(rio para leitura e escrita" # mesmo que $2 acima' s/ que o arquivo 0 bin(rio" Acrescenta dados ou cria uma arquivo bin(rio para leitura e escrita" # mesmo que a2 acima' s/ que o arquivo 0 bin(rio

Fechando um Arquivo

2ara o esva)iamento da memria de um arquivo $ utili)ada a *un%o fclose()' que associa-se diretamente ao nome lgico do arquivo (ST E!"):

fclose (Arquivo);

Gravando e lendo Dados em Arquivos

Existem v1rias *un%(es em C para a opera%o de grava%o e leitura de dados em arquivos. !&aixo seguem algumas:
putc() ou fputc(): 9rava um :nico caracter no arquivo fprintf() : 9rava dados *ormatados no arquivo' de acordo com o tipo de dados (*loat' int' ...). Similar ao print*' por$m ao inv$s de imprimir na tela' grava em arquivo fwrite() : 9rava um con-unto de dados /eterog;neos (struct) no arquivo fscanf(): retorna a quantidade vari1veis lidas com sucesso

Sintaxe das funes para ravao


9rava o conte:do da vari1vel caracter no arquivo


put( ((!r!(ter, !rquivo);

9rava dados *ormatados no arquivo' de acordo com o tipo de dados (*loat' int' ...)
fprintf(!rquivo, "for+!to ", v!r,, v!r- ...);

9rava um con-unto de dados /eterog;neos (struct) no arquivo


fwrite ("uffer, t!+!n)oe+".te , qu!ntid!de, ponteirode!rquivo);

etorna a quantidade vari1veis lidas com sucesso


f (!nf(!rquivo, "for+!to ", /v!r,, /v!r- ...);

!m pro rama usando o fscanf


0in(1ude 2 tdio.)3 0in(1ude 2(onio.)3 0in(1ude 2 trin'.)3 0in(1ude 2( td1i"3 0in(1ude 2io tre!+3 u in' n!+e p!(e td; int +!in(int !r'(, ()!r *!r'v45) { 67%E *!rq8(1iente; ()!r v!r8 exo, v!r8!rquivo8!ux, no+e(1i49:5; int (d8(1i, v18id!de, indi(e = :; f1o!t v181i+ite8(redito; !rq8(1iente = fopen("$%7E;TE.TXT", "r"); if (!rq8(1iente == ;<%%) { printf("\nArquivo $%7E;TE.TXT n!o pode er !"erto."); printf("\nO(orreu u+ Erro &r!ve = < e !1'u+! te(1! p!r! fin!1i>!r ="); 'et()(); *e1 e { v!r8!rquivo8!ux = f (!nf(!rq8(1iente, "?d ?( ? ?d ?f",/(d8(1i, /v!r8 exo ,/no+e(1i, /v18id!de, /v181i+ite8(redito); w)i1e (v!r8!rquivo8!ux == EO6) { indi(e = indi(e @ ,; printf("\n A!do do ?d B (1iente # \n ", indi(e); printf("\n $odi'o do $1iente...# ?d Cexo..# ?(", (d8(1i, v!r8 exo); printf("\n ;o+e do $1iente.................# ? ", no+e(1i); printf("\n 7d!de..........# ?d $redito....# ?D.-f", v18id!de, v181i+ite8(redito); printf("\nEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 4Te(1e !1'o5 ="); 'et()(); v!r8!rquivo8!ux = f (!nf(!rq8(1iente, "?d ?( ? ?d ?f",/(d8(1i, /v!r8 exo ,/no+e(1i, /v18id!de, /v181i+ite8(redito); * f(1o e (!rq8(1iente); printf("\n *** 67F # 4Te(1e !1'o5 ="); 'et()(); * *

"endo e Gravando #struturas

!l$m da manipula%o de arquivos do tipo texto' pode-se ler e escrever estruturas maiores que < &0te' usando as *un%(es fread() e fwrite()' con*orme as sintaxes a seguir:
fre!d (buffer, t!+!n)oe+".te , qu!ntid!de, ponteirode!rquivo) fwrite(buffer, t!+!n)oe+".te , qu!ntid!de, ponteirode!rquivo)

"endo e Gravando #struturas

O buffer $ um endere%o de memria da estrutura de onde deve ser lido ou onde devem ser escritos os valores (*read() e *8rite()' respectivamente) O tamanhoembytes $ um valor num$rico que de*ine o n:mero de &0tes da estrutura que deve ser lida3escrita ! quantidade $ o n:mero de estruturas que devem ser lidas ou escritas em cada processo de *read ou *8rite O ponteirodearquivo $ o ponteiro do arquivo de onde deve ser lida ou escrita uma estrutura

"endo e Gravando #struturas


+ormalmente $ necess1rio manipular arquivos por meio de estruturas de dados ou arquivos de estruturas (struct) 2odemos por exemplo *alar num arquivo de CLIENTES' onde cada cliente possui NOME' RG' ENDERECO E TELEFONE

"endo e Gravando #struturas


! *un%o sizeof retorna a quantidade de &0tes de um determinado tipo ou vari1vel Tal *un%o $ importante para que o programa de manipula%o de arquivos possa sa&er se ainda existem registros para serem lidos 2or exemplo' enquanto o retorno da instru%o a&aixo *or igual a <' o programa continua lendo registros:
retorno = fre!d(/G(1i, i>eof( tru(t T(1iente), ,, (1iente);

$osicionando em um re istro

2or meio da linguagem C no $ possvel sa&er qual $ a posi%o de cada registro no arquivo Em outras linguagens' a movimenta%o em registros $ *eita por meio de *un%(es que *a)em a leitura da lin/a do registro Em C esta posi%o pode ser calculada pelo taman/o do registro

$osicionando em um re istro

+o $ possvel' como em outras linguagens' pedir para que se posicione no segundo' terceiro ou :ltimo registro 2ara isso' programador em C deve sa&er o taman/o em &0tes de cada registro' e posicionar-se de acordo com este taman/o. ! *un%o seek()' apresentada logo a&aixo movimenta-se de &0te em &0te
eeH(2referIn(i!8!o8!rquivo3, 2n3, 2+odo3);

$osicionando em um re istro

O par=metro 2n3 indica quantos &0tes devem ser avan%ados ou retrocedidos O exemplo a seguir posiciona-se no quarto registro do arquivo de cliente O&serve que $ utili)ada uma *un%o auxiliar > a *un%o sizeof() que indica quantos &0tes possui o registro a ser inserido (ou a estrutura de*inida para o registro)
f eeH(Arquivo8de8$1iente, J * i>eof($1iente), CEEK8CET);

$osicionando em um re istro

+este caso o tipo Cliente' que $ o registro' *oi utili)ado para indicar o taman/o de cada registro "ultiplicando-se o valor retornado por quatro o&t$m-se o local do quarto registro do arquivo. Caso o local (o registro) solicitado no exista no ser1 *eito o posicionamento e o registro atual continuar1 sendo o mesmo

$osicionando em um re istro

Outros par=metros usados pela *un%o see?()


SEEK_SET - 2arte do incio do arquivo e avan%a 2n3 &0tes SEEK_END - 2arte do *inal do arquivo e retrocede 2n3 &0tes SEEK_CUR - 2arte do local atual e avan%a 2n3 &0tes

Refer ncias

Prof Evaldo de !liveira" Slides do curso de Estruturas de Dados II#

Você também pode gostar