Introdução

Manipulação de arquivos em C

Estrutura de Dados II Prof Jairo Francisco de Souza

Manipulação de Arquivo em C

Existem dois tipos possíveis de acesso a arquivos na linguagem C : sequencial (lendo um registro após o outro) e aleatório (posicionando-se diretamente num determinado registro) Os arquivos em C são 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

 

Manipulação de Arquivo em C  ! ta&ela a&aixo apresenta as principais *un%(es da linguagem C para manipula%ão de arquivos Função Ação 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 impressão 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() .

. C' sendo composto por uma s$rie de *un%(es' cu-os protótipos estão 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.Manipulação de Arquivo em C  O sistema de entrada e saída do !+S.

Manipulação 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 não 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  .

.txt".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."w").

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 não pode er !"erto # TE$%E A%&O").txt"."w")) == NULL) { printf("\n Arquivo TEXTO. 'et()().Abrindo um Arquivo  5e acordo com a instru%ão anterior' est1 sendo a&erto um arquivo de nome 6texto.

append -' se ele )( e!istir' ou um novo arquivo ser( criado' no caso de arquivo não 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 não e!istir' ser( criado" Abre um arquivo te!to para grava%ão e leitura" #s dados serão adicionados no fim do arquivo se ele )( e!istir' ou um novo arquivo ser( criado' no caso de arquivo não 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 .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 não 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 serão adicionados no fim do arquivo .

.Fechando um Arquivo  2ara o esva)iamento da memória de um arquivo $ utili)ada a *un%ão fclose()' que associa-se diretamente ao nome lógico do arquivo (ST E!"): fclose (Arquivo).

Similar ao print*' por$m ao inv$s de imprimir na tela' grava em arquivo  fwrite() : 9rava um con-unto de dados /eterog.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.).neos (struct) no arquivo  fscanf(): retorna a quantidade vari1veis lidas com sucesso  .. !&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' ..

)..te . v!r... qu!ntid!de.) fprintf(!rquivo. t!+!n)oe+".. ponteirode!rquivo). /v!r...). v!r... "for+!to ". "for+!to ".neos (struct) no arquivo fwrite ("uffer. /v!r. !rquivo)... . 9rava dados *ormatados no arquivo' de acordo com o tipo de dados (*loat' int' .Sintaxe das funções para ravação   9rava o conte:do da vari1vel caracter no arquivo put( ((!r!(ter.  etorna a quantidade vari1veis lidas com sucesso f (!nf(!rquivo.  9rava um con-unto de dados /eterog.

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

ponteirode!rquivo) fwrite(buffer. t!+!n)oe+".te . t!+!n)oe+". ponteirode!rquivo) . qu!ntid!de."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.te . qu!ntid!de.

"endo e Gravando #struturas     O buffer $ um endere%o de memória 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 .

. (1iente). . i>eof( tru(t T(1iente).."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.

$osicionando em um re istro    2or meio da linguagem C não $ possível 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 $ possível' 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. . 2+odo3). 2n3.

$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). .

Caso o local (o registro) solicitado não exista não ser1 *eito o posicionamento e o registro atual continuar1 sendo o mesmo .$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.

2arte do início do arquivo e avan%a 2n3 &0tes SEEK_END .2arte do local atual e avan%a 2n3 &0tes .2arte do *inal do arquivo e retrocede 2n3 &0tes SEEK_CUR .$osicionando em um re istro  Outros par=metros usados pela *un%ão see?()    SEEK_SET .

Refer ncias ● Prof Evaldo de !liveira" Slides do curso de Estruturas de Dados II# .