Académique Documents
Professionnel Documents
Culture Documents
Manipulao de arquivos em C
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
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
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
!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);
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
9rava dados *ormatados no arquivo' de acordo com o tipo de dados (*loat' int' ...)
fprintf(!rquivo, "for+!to ", v!r,, v!r- ...);
!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)
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
+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
! *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
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