- At ento, tnhamos um grande problema no que se referia ao armazenamento
de informaes: capacidade fnita das estruturas de dados utilizadas (vetor ou registro), e a volatilidade dos dados armazenados na memria A!" - #s arquivos permitem armazenar grandes quantidades de informaes, por um grande perodo de tempo" RAM Manipulao de Arquivos #s passos $ e % so sempre id&nticos em todos os casos" # passo ' est( sempre relacionado a uma pesquisa" # passo ) diferente, mas todos os passos esto relacionados ao *u+o das informa,-es: do usurio para o arquivo e do arquivo para o usurio" Arquivos em Pascal Disco rgido !D! . /ari(veis 0imples ./ari(veis 1ompostas /etor /ol(til 2inita . 3rande capacidade de armazenamento . 4o vol(til 0olu,o 0olu,o555 Consultar arquivo 1 Abrir gaveta do arquivo; 2 Achar ficha procurada; 3 Copiar informaes da ficha; 4 Fechar gaveta do arquivo" Acrescentar dados 1 Abrir gaveta do arquivo; 2 Achar posio de insero; 3 !uardar ficha nova" 4 Fechar gaveta do arquivo; Modificar dados 1 Abrir gaveta do arquivo; 2 Achar ficha procurada; 3 A"terar dados da ficha; 4 Fechar gaveta do arquivo; Eliminar dados 1 Abrir gaveta do arquivo; 2 Achar ficha procurada; 3 #etirar a ficha do arquivo; 4 Fechar gaveta do arquivo; "ipos dos Arquivos - Arquivos do tipo te+to, Arquivos com tipo defnido e Arquivos sem tipo defnido" o Arquivos do tipo te+to : te#t$ no so estruturados" o Arquivos com tipo defnido : %le of &tipo', contm dados de um determinado tipo, fornecem uma entrada e sada mais r(pida (no requer transformaes) e f(cil do que os arquivos do tipo te+to, disp-em de uma estrutura rgida dependente do tipo dos dados do arquivo" 4o podem usar readln nem (riteln, pois no so formados por linhas, so organizados em registros" 6em e+atamente o mesmo formato de quando armazenados na memria A!" - #s identifcadores de arquivos so declarados do mesmo modo que os identifcadores de vari(vel: )ar 7varivel identi%cador do arquivo tipo te#to8 : "e#t" )ar 7varivel identi%cador do arquivo com tipo de%nido8: *ile of ®istro'" )ar 7varivel identi%cador do arquivo sem tipo de%nido8 : *ile" - Antes de usa 7varivel identi%cador do arquivo8 para entrada ou sada, voc& deve atribu+la a um arquivo em disco9 Assign (<varivel identifcador do arquivo>,d:\tmp\teste.dat .inf .dad .cad) - A liga,o entre o identifcador do arquivo e o prprio arquivo em disco, entretanto, permanece efetiva mesmo depois do fechamento do arquivo" Abrindo um arquivo - 4o se pode o:ter alguma informa,o contida em uma gaveta sem antes a:ri.la" - R,-,".*/ : a:re o arquivo para leitura9 ;osiciona o ponteiro do arquivo no incio do arquivo" - R,0R1",.*/ : prepara um arquivo para ser gravado9 0e o arquivo no e+istir, o 6ur:o ir( cri(.lo9 0e o arquivo <( e+istir, seu conte=do ser( destrudo e o ponteiro posicionado no incio do arquivo" - A22,3D.*/ : preserva o conte=do de um arquivo e posiciona seu ponteiro no fnal do arquivo9 1omo resultado, qualquer dado includo no arquivo ser( acrescentado aos dados <( e+istentes" *ec4ando um arquivo - 4o podemos dei+ar uma gaveta a:erta depois de us(.la, pois seu conte=do pode ser danifcado" - 567-,.*/ : assegura que todos os dados contidos nos :u>ers tempor(rios se<am armazenados em disco (descarga de bufer)" - *68-.*/ : o:riga o 6ur:o a esvaziar o :u>er de sada antes de ele ser preenchido, faz com que todos os dados do :u>er se<am gravados imediatamente em disco" 5opiando um registro - 1opia de um lugar (arquivo em disco) para outro diferente (registro)" - -,,9.*$27-/ : move o ponteiro do arquivo para o incio do n=mero do registro 27- no arquivo *9 ;osicionar na posi,o :, incio do arquivo9 - read.*$R,;/ : l& a informa,o do arquivo em disco, *, para a vari(vel de memria, R,;" - ;ara ler ou e+trair informa,-es de um arquivo te+to : readln.*$</" ;uardando um registro - A estrutura do registro que ser( gravado deve ser a mesma dos registros <( pertencentes ao arquivo em disco" - *16,-1=,.*/ : retorna o n=mero de registros contido em * no momento9 - -,,9.*$27-/ : move o ponteiro do arquivo para o incio do n=mero do registro 27- no arquivo *9 ;osicionar na posi,o %lesize.*/, fnal do arquivo, posi,o de inser,o9 - (rite.*$R,;/ : escreve uma informa,o contida em uma vari(vel de memria, R,;, em um arquivo em disco, *" - ;ara gravar informa,-es em um arquivo te+to : (riteln.*$</" 7utros comandos relevantes - *16,-1=,.*/ : retorna o n=mero de registros contido em * no momento9 - ,7*.*/ : retorna ),RDAD,1R7 quando o ponteiro de arquivo especifcado em * chega ao fnal do arquivo (end-of-fle)9 program m?@arquivo" uses crt" t?pe reg A record nome : stringB$CD" salario : real" end" arq@tipado A fle of reg" EFFFFFFFF !anipulacao de Arquivos do tipo 6e+to FFFFFFFG procedure a:re@t+t(var p:te+t)" :egin reset(p)" end" procedure cria@t+t(var p:te+t)" :egin reHrite(p)" end" function arq@e+iste@t+t(var p:te+t)::oolean" :egin EIJ.G reset(p)" E0JKG arq@e+iste@t+t :A (J#esult 78 L)" end" EFFFFF !anipulacao de Arquivos com tipo Mefnido FFFFFG procedure a:re@tp(var p:arq@tipado)" :egin reset(p)" end" procedure cria@tp(var p:arq@tipado)" :egin reHrite(p)" end" function arq@e+iste@tp(var p:arq@tipado)::oolean" :egin EIJ.G reset(p)" E0JKG arq@e+iste@tp :A (J#esult 78 L)" end" var + : reg" f : te+t" g : arq@tipado" :egin assign(f,Nd:Oteste$9cadN)" if arq@e+iste@t+t(f) then cria@t+t(f) else Hrite(NArquivo a:erto9N)" append(f)" Hriteln(f,NAl:ert Pinsten N)" Hriteln(f,N;edro 2rosi N)" Hriteln(f,NQoao de Meus N)" assign(g,Nd:Oteste'9cadN)" if arq@e+iste@tp(g) then cria@tp(g) else Hrite(NArquivo a:erto9N)" seeR(g,flesize(g))" +9nome :A NAl:erto o:ertoN" +9salario :A $LL" Hrite(g,+)" +9nome :A NQonas de 0ousaN" +9salario :A 'LL" Hrite(g,+)" clrscr" seeR(g,L)" Hhile not(eof(g)) do Segin read(g,+)" Hriteln(+9nome:$C,N T N, +9salario:U:')" end" readln" close(f)" close(g)" end9 3. Arquivos em C 3$1 Arquivos %a "inguagem de programao C& a informao sobre um arquivo ' acessada atrav's de um descritor cu(a estrutura ' definida no arquivo de cabea"ho stdio.h$ )m programa C que v* manipu"ar arquivos deve ento incorporar ao in+cio de seu programa fonte a "inha de inc"uso desse arquivo de cabea"ho, #include <stdio.h> -sse arquivo de cabea"ho define o nome de tipo FILE associado a essa estrutura$ %o ' necess*rio conhecer o formato interno dessa estrutura para manipu"ar arquivos$ . programador C& para acessar arquivos& define vari*veis ponteiros para este tipo& FILE *& que so manipu"adas diretamente pe"as funes da bib"ioteca padro de entrada e sa+da$ /ais vari*veis so usua"mente chamadas de manipuladores de arquivo$ Assim& a funo que vai manipu"ar o arquivo deve inc"uir a dec"arao de uma vari*ve" desse tipo& como em, FILE *arqFonte; FILE *Cliente; FILE *Cadastro; . ob(etivo de manipu"ar um arquivo ' rea"i0ar operaes de "eitura e escrita sobre seu conte1do$ 2ara que essas operaes de transfer3ncia de dados tenham sucesso& ' preciso que ha(a a permisso adequada para a operao$ 2or e4emp"o& um tec"ado seria um dispositivo que no aceita sa+da de dados 5escrita6& mas apenas entrada 5"eitura6$ 3$2 7eitura e !ravao em A"to-%+ve" 2ara a manipu"ao de arquivo em disco& o programa e o sistema operaciona" devem participar con(untamente de certas informaes sobre o arquivo$ -m outras pa"avras& informaes espec+ficas sobre o arquivo devem estar presentes antes que o programa possa acess*-"o$ -m C& as informaes necess*rias so guardadas em uma estrutura do tipo F87-$ A definio dessa estrutura est* contida no arquivo stdio.h$ 3$3 Abrindo arquivos com fopen56 2ara abrir um arquivo em C& a rotina fopen ' invocada recebendo dois par9metros$ . primeiro ' uma string com o nome do arquivo que ser* aberto$ . segundo par9metro ' outra string que especifica o modo de acesso& que pode conter os caracteres r 5"eitura6& w 5escrita6& e a 5escrita ao fina" -- append6$ . va"or de retorno ' o manipu"ador a"ocado para o arquivo aberto$ A funo fopen56 e4ecuta duas tarefas$ -m primeiro "ugar& cria e preenche uma estrutura F87- com as informaes necess*rias para o programa& e para o sistema operaciona" de maneira que possam se comunicar$ -m seguida& retorna um ponteiro do tipo F87- que aponta para a "oca"i0ao na mem:ria dessa estrutura criada$ 2or e4emp"o& para rea"i0ar a "eitura do conte1do de um arquivo chamado teste.asm& a seguinte e4presso poderia ser usada no programa, arqFonte = fopen!teste.asm!" !r!#; Cliente = fopen!Cliente.asm!" !r!#; Cadastro = fopen!Cadastro.asm!" !r!#; Caso o arquivo no possa ser aberto& a funo fopen retorna o ponteiro nu"o$ Assim& para verificar se o arquivo foi aberto sem prob"emas& ' necess*rio testar o va"or de retorno, A>R13D7 8M AR?81)7
Arquivo ; fopen 5<te4to$t4t<&<=<6;
A funo que abre um arquivo em C ' a funo fopen()& que devo"ve o va"or NULL 5nu"o6 ou um ponteiro associado ao arquivo& devendo ser passado para funo o nome f+sico do arquivo e o modo como este arquivo deve ser aberto$
Com a instruo acima& est* sendo aberto um arquivo de nome <te$to.t$t<& no disco& habi"itado apenas para escrita 5w%write6$ )ti"i0ando-se t'cnicas de verificao& pode-se codificar a instruo acima da seguinte maneira, if &rqui'o = fopen!te$to.t$t!"!w!## == NULL# ( printf!)n &rqui'o *E+*,.*+* n-o pode ser a.erto / *ECLE &L0,!#; 1etch#; 2
-ncerradas as operaes sobre um arquivo& e"e deve ser fechado$ 8sso permite que o sistema operaciona" "ibere o espao ocupado pe"as informaes sobre o arquivo para que esse mesmo espao possa ser reocupado para a manipu"ao de outros arquivos$ -sta "iberao ' importante& uma ve0 que sistemas operacionais tipicamente "imitam a quantidade de arquivos que podem ser abertos simu"taneamente devido a restries de espao a"ocado para essas estruturas au4i"iares$ 2ara fechar um arquivo previamente aberto& a rotina fclose pode ser usada$ -"a recebe como argumento o manipu"ador do arquivo e no retorna nenhum va"or$ Assim& ap:s encerrada a operao com o arquivo a e4presso fclosearqFonte#; fecha-o$ fclosearqFonte#; fcloseCliente#; fcloseCadastro#; Fechar um arquivo significa& em primeiro "ugar& esva0iar o seu buffer& gravando ne"e os caracteres remanescentes$ %o fa"amos sobre buffer antes porque& quando se usa a"to-n+ve"& e"e ' invis+ve" para o programador$ -ntretanto& o buffer ' necess*rio& mesmo que invis+ve"$ Considere& por e4emp"o& quo ineficiente seria acessar o disco somente para gravar um caractere$ >e voc3 digitar v*rios caracteres rapidamente e cada um necessitar de um acesso comp"eto ao disco& v*rios de"es sero& provave"mente& perdidos$ -is como um buffer funciona, quando voc3 envia um caractere para um arquivo com fputc56& e"e ' arma0enado& temporariamente& numa *rea de mem:ria reservada para essa tarefa$ -ssa *rea de mem:ria chama-se buffer$ ?uando e"e estiver "otado& seu conte1do ser* gravado no arquivo de uma 1nica ve0$ )ma das ra0es para fechar arquivos ' que& nesse momento& o programa fora a gravao do buffer ne"e$ .utra ra0o para fechar o arquivo ' "iberar as *reas de comunicao usadas& para que este(am dispon+veis a outros arquivos$ -ssas *reas inc"uem a estrutura F87- e o buffer$ .utra funo que fecha arquivos ' a e4it56$ -"a difere da funo fc"ose56 em v*rios pontos$ 2rimeiro& e4it56 fecha todos os arquivos abertos$ >egundo& encerra o programa e devo"ve o contro"e ao sistema operaciona"$ A funo fc"ose56 simp"esmente fecha o arquivo associado ao ponteiro F87- enviado como argumento$ 3$4 - !rupo 1, !ravar e "er um caractere por ve0 - As funes fputc56 e fgetc56 As funes fputc56 e fgetc56 gravam e "3em um caractere por ve0$ @inc"ude Astdio$hB CCdefine F87- @inc"ude Astd"ib$hB main() E 2JVP Ffptr" char ch" fptr A fopen(Warqte+t9t+tX,XHX)" Hhile ( (ch A getche()) YA ZOr[ ) \\enquanto tecla diferente de P46P fputc(ch, fptr") fclose(fptr)" G ]ma vez esta:elecida uma linha de comunica,o com um arquivo particular por meio de sua a:ertura, podemos escrever nele9 A fun,o fputc() rece:e dois argumentos: o caractere a ser gravado e o ponteiro para a estrutura 2JVP do arquivo9 Pla retorna o caractere gravado ou P#2 se acontecer algum erro9 # comando fgetc() l&, do arquivo, um caractere por vez e o imprime no vdeo9 @inc"ude Astdio$hB CCdefine F87- @inc"ude Astd"ib$hB main() E 2JVP Ffptr" short int ch" fptr A fopen(Warqte+t9t+tX,XHX)" Hhile ( (ch A fgetc(fptr)) YA P#2 ) printf(W^cX, ch)" fclose(fptr)" G SINTAXE ! P"TC#
putc $caracter% arquivo&' CD !rava o conte1do da vari*ve" caracter no <arquivo< DC
Ee(amos o e4emp"o de putc& num programa que simu"a um editor de te4to& bem simp"es& que grava em arquivo um te4to que vai sendo digitado via tec"ado at' que o usu*rio fina"i0e com um C/#7FG
#include <stdio.h> #include <conio.h> 'oid main # ( FILE *&rqui'o; char Caractere" 3ome4567; clrscr#; printf!3ome do arqui'o8 !#; fflushstdin#; 1ets3ome#; &rqui'o = fopen 3ome"!w!#; if &rqui'o == 39LL# ( printf !Erro a.ertura do &rqui'o / :s. *ecle al1o ;)n!"3ome#; 1etch#; 2 else ( do ( Caractere = 1etche#; if Caractere == <=# ( )* teclou enter *) putc>)n>"&rqui'o#; )* 1ra'a um )n no arqui'o printf!)n!#; )* pular linha na tela pois 1etche n-o fa? isso com enter *@ 2 else ( putcCaractere"&rqui'o#; 2 2 while Caractere ;= 5A#; @@ C*BL C D para encerrar 2 fclose&rqui'o#; printf!)n Fim da di1itaE-o do te$to ;! #; 1etch#; 2 Pro(rama ) * Manipula+,o de arquivo-te.to para escrita SINTAXE ! /ETC#
Caracter 0 (etc $arquivo&' CD 73 um caracter do <arquivo< e retorna para a vari*ve" Caracter DC
(etc retorna -.F caso encontre o fim-de-arquivo ou em caso de erro na "eitura
Ee(amos o e4emp"o de getc& num programa que simu"a um <mostrador< de te4to& bem simp"es& que "3 arquivo te4to (* gravado em disco e vai mostrando na te"a ,
&rqui'o = fopen 3ome"!r!#; if &rqui'o == 39LL# ( printf !Erro a.ertura do &rqui'o / :s. *ecle al1o ;)n!"3ome#; 1etch#; 2 else ( Caractere = 1etc&rqui'o#; while Caractere ;= E,F# ( printf!:c!" Caractere#; Caractere = 1etc&rqui'o#; 2 fclose &rqui'o#; fprintf!)n *** fim de te$to *** *ecle al1o ;!# 1etch #; 2 2 Pro(rama 1 * Manipula+,o de arquivo-te.to para leitura 3$H - A funo feof56 -ssa funo retorna verdadeiro se o fina" do arquivo tiver sido atingido; caso contr*rio& retorna fa"so$ =hi"e 5Ifeof5fptr66 J ch ; fgetc5fptr6; printf5KLcM&ch6; N 3$O - Fim de arquivo e a constante -.F P importante entender que -.F no ' um caractere pertencente ao arquivo e sim uma constante& do tipo short int& definida no arquivo stdio$h com o va"or Q4FFFF ou -1$ . fim de um arquivo ' reconhecido pe"o sistema operaciona"& o Rindo=s envia Q4FFFF aos nossos programas para avisar que o arquivo acabou$ Como podemos reconhecer que o arquivo terminouS >e uti"i0armos uma vari*ve" do tipo char para receber os bTtes "idos do arquivo& o caractere de c:digo A>C88 2HH decima" 5Q4FF6& se e4istir dentro do arquivo& ser* interpretado como -.F e a "eitura terminar* antecipadamente$ 2or causa disso& criamos a vari*ve" ch do tipo short int$ Uessa forma& no haver* confuso entre o caractere Q4FF e -.F$ . primeiro ser* arma0enado em ch como Q4QQFF& e o segundo& como Q4FFFF$ A mensagem enviada pe"o sistema operaciona" indicando o fim de arquivo pode ser diferente para sistemas operacionais distintos$ 7ogo& para evitarmos prob"emas para transportar de um sistema operaciona" para outro ' recomend*ve" sempre usar -.F$ 3$V - Cuidados ao abrir o arquivo Uevemos verificar sempre se o arquivo especificado em fopen56 no puder ser aberto& o programa ir* parar$ 2or que um arquivo pode no ser abertoS >e voc3 tiver pedido para abrir um arquivo para gravao& ' prov*ve" que no abra por no haver mais espao em disco$ - se foi para "eitura& ta"ve0 o arquivo no abra por ainda no ter sido criado$ -nto& ' importante que todos os programas que acessam arquivos em disco verifiquem se o arquivo foi aberto com sucesso& antes de "er ou escrever ne"es$ >e o arquivo no pode ser aberto& a funo fopen56 retorna um ponteiro com o va"or %)77$ main() E 2JVP Ffptr" short int ch" if ( (fptr A fopen(Warqte+t9t+tX,XHX)) AA 4]VV) E puts(W4o foi possvel a:rir o arquivo9X)" e+it($)" G Hhile ( (ch A fgetc(fptr)) YA P#2 ) printf(W^cX, ch)" fclose(fptr)" G 3$W - !rupo 2, 7er e gravar "inha a "inha - As funes fputs56 e fgets56 As funes fputs56 e fgets56 gravam e "3em os dados "inha a "inha 5como strings6$ main56 J 2JVP Ffptr" fptr A fopen(Warqte+t9t+tX,XHX)" fputs(W6este_OnX,fptr)" fputs(W6estando_OnX,fptr)" fclose(fptr)" s?stem(W6`;P arqte+t9t+tX)" s?stem(W;A]0PX)" N A funo fputs56 recebe dois argumentos, o ponteiro char& para a cadeia de caracteres a ser gravada& e o ponteiro para a estrutura F87- do arquivo$ #etorna um n1mero positivo ou -.F se acontecer a"gum erro$ A funo fputs56 no co"oca automaticamente o caractere de nova "inha no fim de"a& devemos adicion*-"o e4p"icitamente$ A funo fgets56 recebe 3 argumentos, o ponteiro char para a cadeia de caracteres em que os dados "idos do arquivo sero co"ocados& o n1mero m*4imo de caracteres a serem "idos& e o ponteiro para a estrutura F87- do arquivo$ #etorna um ponteiro para a cadeia de caracteres "ida ou %)77 se encontrar a"gum erro ou o fim do arquivo$ main() E 2JVP Ffptr" char strBa$D" if ( (fptr A fopen(Warqte+t9t+tX,XHX)) AA 4]VV) E puts(W4o foi possvel a:rir o arquivo9X)" e+it($)" G Hhile ( fgets(str, aL, fptr) YA 4]VV) printf(W^sX,str)" fclose(fptr)" G 3$X - !rupo 3, 7er e gravar dados formatados - As funes fprintf56 e fscanf56 As funes fprint56 e fscanf56 gravam ou "3em os dados de modo formatado$ main56 J F87- Dfptr; char titu"oY3QZ; int regnum; doub"e preco; fptr ; fopen5K"ivros$t4tM&M=M6; =hi"e 5/#)-6 J printf5K[nUigite titu"o& registro e preco do "ivroM6; scanf5KLs Ld L"fM& titu"o& \regnum& \preco6; if 5str"en5titu"o6 A; 16 brea]; fprintf5fptr& KLs Ld L$2"f[nM& titu"o& regnum& preco6; N fc"ose5fptr6; N A funo fprint56 escreve os va"ores das 3 vari*veis no arquivo$ -ssa funo ' simi"ar a printf56& e4ceto pe"o fato de que o ponteiro para fi"e ' tomado como primeiro argumento$ /odas as possibi"idades de formato de printf56 operam com fprintf56$ A funo fscanf56 para "er os dados do disco$ -ssa funo ' simi"ar ^ funo scanf56& e4ceto pe"o fato de que& como em fprintf56& um ponteiro para fi"e dever* ser inc"u+do como primeiro argumento$ main56 J F87- Dfptr; char titu"oY3QZ; int regnum; doub"e preco; fptr ; fopen5K"ivros$t4tM&M=M6; =hi"e 5fscanf5fptr& KLs Ld L"fM& titu"o& \regnum& \preco6 I; -.F6 J printf5 KLs Ld L$2"f[nM& titu"o& regnum& preco6; N fc"ose5fptr6; N A& 2EN! E /3A4AN! A!S 56!3MATA!S5 com fscanf e fprintf
Sinta.e # int fprintf$arquivo% 5formatos5% var)% var1 ...&'
fprintf retorna a quantidade de :?tes gravadas ou P#2 em caso de erro
4o e#emplo a:ai+o, suponha que arqfunc foi a:erto com fopen 999 ... *16, @arqfuncA int idade B CD$ totEbFtesA c4ar se#o B GMGA Hoat salario B IIC!JIA ... totEbFtes B fprintf .arqfunc$ KLd Lc Lf K$ idade$ se#o$ salario/A
o:s9 : #s formatos devem ser separados por espa,os em :ranco
int fscanf$arquivo% 5formatos5% 7var)% 7var1 ...&'
fscanf retorna a quantidade vari(veis lidas com sucesso
4o e#emplo a:ai+o, suponha que arqfunc foi a:erto com fopen 999 ... *16, @arqfuncA int idade B CD$ totbFtesA c4ar se#o B GMGA Hoat salario B IIC!JIA ... quantEvar B fscanf .arqfunc$ KLd Lc Lf K$ Midade$ Mse#o$ @salario/A
o:s9 : #s formatos devem ser separados por espa,os em :ranco
7>- : # uso de fscanf no recomendada para string pois, da mesma forma que scanf com ^s, fscanf tam:m encerra e leitura ao encontrar um espa,o em :ranco9 Pm outras palavras, se no arquivo estiver gravado um nome bQ#0P MA 0JV/A 0#]cAb o fscanf ler( apenas para o formato ^s a palavra bQ#0Pb9 1omo alternativa poderamos usar a fun,o fgets$ mas esta e+ige que se sai:a a quantidade de caracteres a ser lido a cada momento9 esolveremos este pro:lema com fread e f(rite!
Me qualquer forma, ve<amos e+emplos de programas com o uso de fprintf e fscanf
# programa a:ai+o, o:tm o 5Ndigo do *uncionrio, o se#o, a idade e o salrio de 3 pessoas, a partir do teclado, e grava os dados num arquivo$ utilizando fprintf
# 1ritrio de termina,o quando o usu(rio digita um cdigo do funcion(rio negativo ;or quest-es de simplifca,o no estamos verifcando se o arquivo foi a:erto com sucesso, nem se o se+o v(lido ou no 999
'oid main# ( FILE *arqfunc; int se$o; int codfunc" idade; float salario;
arqfunc = fopen!F93CI,3&.F&F!" !w!#;
if arqfunc == 39LL# ( printf!)n&rqui'o F93CI,3&.F&F nao pode ser criado.!#; printf!)nErro 0ra'e ; *ecle al1o ;!#; 1etch#; 2 else ( clrscr#; do ( printf!)n Fi1ite o codi1o do funcionario ou um numero ne1ati'o ) para encerrar / !#; scanf!:d!" Gcodfunc#; if codfunc > 6#( printf!)n Fi1ite o se$o 4H ou F7 / !#; se$o = 1etche#;
printf!)n Fi1ite a idade / !#; scanf!:d!" Gidade#; printf!)n Fi1ite o salario / !#; scanf!:f!" Gsalario#; @* a instrucao a.ai$o 1ra'a os dados no arqui'o *@ fprintfarqfunc" !:d :c :d :f !" codfunc" se$o" idade" salario#; 2 2 while codfunc > 6#; fclose arqfunc#; 2 2 @* pro1rama e$emplo com fscanf
fclose arqfunc#; printf!)n *** FIH / *ecle al1o ; !#; 1etch#; 2 2 3$1Q - _odos de abertura de arquivos A"'m do modo de escrita& a "inguagem C permite o uso de a"guns va"ores padroni0ados para o modo de manipula+,o de arquivos& conforme mostra a Ta8ela )
Modo Si(nificado <r< Abre um arquivo te4to para "eitura$ . arquivo deve e4istir antes de ser aberto$ <=< Abrir um arquivo te4to para gravao$ >e o arquivo no e4istir& e"e ser* criado$ >e (* e4istir& o conte1do anterior ser* destru+do$ <a< Abrir um arquivo te4to para gravao$ .s dados sero adicionados no fim do arquivo 5<append<6& se e"e (* e4istir& ou um novo arquivo ser* criado& no caso de arquivo no e4istente anteriormente$ <rb< Abre um arquivo bin*rio para "eitura$ 8gua" ao modo <r< anterior& s: que o arquivo ' bin*rio$ <=b< Cria um arquivo bin*rio para escrita& como no modo <=< anterior& s: que o arquivo ' bin*rio$ <ab< Acrescenta dados bin*rios no fim do arquivo& como no modo <a< anterior& s: que o arquivo ' bin*rio$ <rF< Abre um arquivo te4to para "eitura e gravao$ . arquivo deve e4istir e pode ser modificado$ <=F< Cria um arquivo te4to para "eitura e gravao$ >e o arquivo e4istir& o conte1do anterior ser* destru+do$ >e no e4istir& ser* criado$ <aF< Abre um arquivo te4to para gravao e "eitura$ .s dados sero adicionados no fim do arquivo se e"e (* e4istir& ou um novo arquivo ser* criado& no caso de arquivo no e4istente anteriormente$ <rFb< Abre um arquivo bin*rio para "eitura e escrita$ . mesmo que <rF< acima& s: que o arquivo ' bin*rio$ <=Fb< Cria um arquivo bin*rio para "eitura e escrita$ . mesmo que <=F< acima& s: que o arquivo ' bin*rio$ <aFb< Acrescenta dados ou cria uma arquivo bin*rio para "eitura e escrita$ . mesmo que <aF< acima& s: que o arquivo ' bin*rio Ta8ela ) - Modos para manipula+,o de arquivos 3$11 - _odo te4to e modo bin*rio -m modo te4to& cada caracter 5digito& "etra& ou caracter especia"6 ocupa um bTte$ .u se(a& para gravar o n1mero 321H3& que em mem:ria ocuparia 2 bTtes& em arquivo modo te4to so necess*rios H bTtes$ . modo bin*rio ' mais eficiente para guardar n1meros pois ocupa menos espao$ 5_ais deta"hes p*gina 3H1& "ivro te4to$6 3$12 - !rupo 4, 7er e gravar b"ocos de bTtes - As funes f=rite56 e fread56 A"'m da manipula+,o de arquivos do tipo te4to& pode-se "er e escrever estruturas maiores que 1 .Lte& usando as funes fread() e fwrite()& conforme os prot:tipos seguintes$ fread 5buffer& tamanhoembTtes& quantidade& ponteirodearquivo6 fwrite 5buffer& tamanhoembTtes& quantidade& ponteirodearquivo6
. .uffer ' um endereo de mem:ria da estrutura de onde deve ser "ido ou onde devem ser escritos os va"ores 5fread# e fwrite#& respectivamente6$ . tamanhoem.Ltes ' um va"or num'rico que define o n1mero de .Ltes da estrutura que deve ser "idaCescrita$ A quantidade ' o n1mero de estruturas que devem ser "idas ou escritas em cada processo de fread ou fwrite. . ponteirodearqui'o ' o ponteiro do arquivo de onde deve ser "ida ou escrita uma estrutura$
%orma"mente quando traba"hos com arquivos 5no te4to6& uti"i0amos arquivos de estruturas 5struct6$ 2odemos por e4emp"o fa"ar num arquivo de C78-%/->& onde cada c"iente possui %._-& #!& -%U-#-C. - /-7-F.%-$ Na lin(ua(em de A39"I4!S % cada !C!33:NCIA de cliente num arquivo ; chamado de 3E/IST3! e cada informa+,o dentro do 3E/IST3! do cliente ; chamada de CAMP! . %um arquivo com 1Q c"ientes& di0emos que h* 1Q registros$ %o e4emp"o acima& di0emos que os campos do #-!8>/#. de C"ientes so , %._-& #!& -%U-#-`. e /-7-F.%-$
7>-9 : A fun,o sizeof retorna a quantidade de :?tes de um determinado tipo ou vari(vel
,#emplo O
si0eof5int6 retorna 2 de acordo com o tipo de m*quina si0eof5struct c"iente6 retorna a somat:ria de bTtes da struct c"iente
2 printf! )n)n :d clientes cadastrados !" cont#; 1etch#; 2 3$13 - .s ponteiros de arquivos stdin& stdout e stderr >o os 3 primeiros e"ementos da matri0 de estruturas F87-$ -ssas constantes podem ser usadas para acessar qua"quer um dos tr3s arquivos KstandardM predefinidos pe"o sistema operaciona" 5"eitura& gravao e sa+da de erro6$ Cada uma de"as pode ser tratada como um ponteiro para uma estrutura F87-$ F87- Dstdin; F87- Dstdout; F87- Dstderr; 2or padro& a "eitura ' do tec"ado& a gravao e a sa+da de erro so do v+deo$ Ponteiro Stream stdin -ntada padro 5tec"ado6 stdout >a+da padro 5v+deo6 stderr >a+da de erro 5v+deo6 -sses ponteiros so constantes; seus va"ores no podem ser a"terados& mas podem ser usados como argumentos de funes$ A"gumas funes& como getchar& putchar usam stdin e stdout automaticamente$ Eoc3 pode usar os ponteiros F87-& definidos em stdio$h para acessar os arquivos de entrada e sa+da padro$ fgets5string& WQ& stdin6; CC "3 uma cadeia de caracteres do tec"ado A instruo, fputs5string& stdout6; CC imprimir* a string no video$ 3$14 - !ravando estruturas em disco @inc"ude Astdio$hB @inc"ude Astd"ib$hB tTpedef struct 7ivro J char /itu"oYHQZ; short %um#eg; doub"e 2reco; N 7ivro; 7ivro !et7ivro56 J 7ivro "ivro; gets5"ivro$/itu"o6; scanf5KLhdM& \"ivro$%um#eg6; scanf5KL"fM& \"ivro$2reco6; re=ind5stdin6; return "ivro; N main56 J 7ivro "ivro; char resp; F87- Dfptr; if 5 5fptr ; fopen5K7ivros$datM& K=bM66 ;; %)776 e4it516; do J "ivro ; !et7ivro56; if 5f=rite5\"ivro& si0eof57ivro6&1&fptr6 I; 16 brea]; printf5K_ais um 7ivro 5sCn6 SM6; resp ; getche56; N =hi"e 5resp I; anb \\ resp I; a%b6; fc"ose5fptr6; sTstem5KpauseM6; N CC8mpresso @inc"ude Astdio$hB @inc"ude Astd"ib$hB tTpedef struct 7ivro J char /itu"oYHQZ; short %um#eg; doub"e 2reco; N 7ivro; void 2rint7ivro57ivro "ivro6 J printf5K[n/itu"o , Ls [nM& "ivro$/itu"o6; printf5K[n%o #eg, Lhd [nM& "ivro$%um#eg6; printf5K[n2reco , L$2"f [nM& "ivro$2reco6; N main56 J 7ivro "ivro; char resp; F87- Dfptr; if 5 5fptr ; fopen5K7ivros$datM& KrbM66 ;; %)776 e4it516; =hi"e 5 fread5\"ivro& si0eof57ivro6 & 1& fptr6 ;; 1 6 2rint7ivro5"ivro6; fc"ose5fptr6; sTstem5KpauseM6; N 3$1H - A funo re=ind56 A funo re=ind56 ' usada para "impar a"guma sobra de bTtes no tec"ado antes da pr:4ima "eitura$ -sta funo reposiciona o indicador de posio de arquivo no in+cio do arquivo especificado pe"o argumento$ re=ind5stdin6; 3$1O - !ravando e "endo de um mesmo arquivo @inc"ude Astdio$hB @inc"ude Astd"ib$hB tTpedef struct 7ivro J char /itu"oYHQZ; short %um#eg; doub"e 2reco; N 7ivro; 7ivro !et7ivro56 J 7ivro "ivro; gets5"ivro$/itu"o6; scanf5KLhdM& \"ivro$%um#eg6; scanf5KL"fM& \"ivro$2reco6; re=ind5stdin6; return "ivro; N void 2rint7ivro57ivro "ivro6 J printf5K[n/itu"o , Ls [nM& "ivro$/itu"o6; printf5K[n%o #eg, Lhd [nM& "ivro$%um#eg6; printf5K[n2reco , L$2"f [nM& "ivro$2reco6; N main56 J 7ivro "ivro; char resp; F87- Dfptr; ==A8re arquivo para leitura e (rava+,o. Adiciona dados no final if 5 5fptr ; fopen5K7ivros$datM& KabFM66 ;; %)776 e4it516; do J "ivro ; !et7ivro56; if 5f=rite5\"ivro& si0eof57ivro6&1&fptr6 I; 16 brea]; printf5K_ais um 7ivro 5sCn6 SM6; resp ; getche56; N =hi"e 5resp I; anb \\ resp I; a%b6; ff"ush5fptr6; CC -sva0ia o conteudo do buffer de saida fsee]5fptr& Q& Q6; CCCo"oca o ponteiro no inicio do arquivo printf5K[n[n 7ista de 7ivros do ArquivoM6; =hi"e 5 fread5\"ivro& si0eof57ivro6 & 1& fptr6 ;; 1 6 2rint7ivro5"ivro6; fc"ose5fptr6; sTstem5KpauseM6; N fptr ; fopen5K7ivros$datM& KabFM6 . arquivo ' aberto para "eitura e gravao$ )samos a para preservar as estruturas que (* e4istem no arquivo e acrescentar novas ao fina" do arquivo$ >e o arquivo no e4istir& ser* criado$ )samos F pois queremos e4ecutar as 2 operaes, de gravao e de "eitura$ )samos b para traba"har em modo bin*rio$ 3$1V - As funes ff"ush56& fsee]56& fte""56 A funo ff"ush56 grava o conte1do de qua"quer dado e4istente no buffer para o arquivo associado ao ponteiro que recebe como argumento$ #etorna Q para indicar sucesso& caso contr*rio& retorna -.F$ Ap:s esva0iar o buffer& devemos modificar a posio corrente do arquivo para o seu in+cio& com fsee]5fptr& Q& Q6; 2ara entendermos me"hor o conceito de ponteiros para arquivos$ )m ponteiro para um arquivo aponta para um bTte particu"ar chamado posio atua"$ /odas as funes precisam conhecer o ponteiro para o arquivo que dese(amos manipu"ar$ A cada tempo em que gravamos ou "emos qua"quer coisa no arquivo& o ponteiro ' movido para o fim dessa coisa e a pr:4ima "eitura ou gravao comear* nesse ponto$ ?uando o arquivo ' aberto& o ponteiro ' fi4ado em seu primeiro bTte; ento& se quisermos "er ou gravar ne"e estaremos no seu in+cio$ >e abrirmos o arquivo usando a opo a5append6& o seu ponteiro ser* posicionado no fim do arquivo$ A funo fsee]56 permite movimentar a posio corrente de "eitura e gravao do arquivo para uma posio esco"hida, fsee]5fptr& Q& Q6; fi4a o ponteiro no primeiro bTte do arquivo$ Como a "eitura do nosso arquivo deve comear no seu in+cio& queremos des"ocar Q bTte a partir do in+cio do arquivo$ A funo fsee]56 aceita 3 argumentos, . primeiro ' o ponteiro para a estrutura F87- do arquivo$ Ap:s a chamada a fsee]56& esse ponteiro ser* movimentado para a posio que dese(armos; . segundo argumento ' chamado des"ocamento& e consiste no n1mero de bTtes que dese(amos des"ocar a partir da posio especificada pe"o terceiro argumento; o terceiro argumento chama-se posio 5Q-in+cio do arquivo; 1-posio atua"; 2-fim do arquivo6$ A funo fte""56 retorna a posio corrente do ponteiro de um arquivo 5em bTtes6& sempre a partir do in+cio do arquivo$ -ssa funo aceita um 1nico argumento& que ' o ponteiro para a estrutura F87- do arquivo& e retorna um va"or do tipo "ong& que representa o n1mero de bTtes do comeo do arquivo at' a posio atua"$ fsee]5fptr&Q&26; nrec ; fte""5fptr6 C si0eof57ivro6; printf5K. numero de registro Li[nM& nrec6; 3$1W - 8mprimindo na impressora 8mprimir dados na impressora ' e4atamente a mesma coisa que gravar dados num arquivo em disco$ . sistema operaciona" define o nome de a"guns perif'ricos "igados ao computador$ Nome escri+,o C._ Conso"e 5tec"ado e v+deo6 A)c ou C._1 2rimeira porta seria" C._2 >egunda porta seria" 2#% ou 72/1 2rimeira impressora para"e"a 72/2 >egunda impressora para"e"a 72/3 /erceira impressora para"e"a %)77 2erif'rico ine4istente @inc"ude Astdio$hB @inc"ude Astd"ib$hB main56 J char buffYWQZ; F87- Dfptr& Dfprn; if 5 5fptr ; fopen5KFi"e$cM& KrM6 ;; %)77 6 J puts5KArquivo Fi"e$c no foi encontrado$M6; e4it516; N if 5 5fprn ; fopen5K2#%M& K=M6 ;; %)77 6 J puts5K8mpressora indisponive"$M6; e4it516; N =hi"e 5 Ifeof5fptr6 6 J fgets5buff& WQ& fptr6; fputs5buff& fprn6; N fc"ose5fptr6; fc"ose5fprn6; N 3$1X - Condies de erro %a maioria dos casos& se um arquivo for aberto com sucesso& poderemos "er ou gravar ne"e$ -4istem situaes& entretanto& em que isso acontece$ )m prob"ema de hard=are pode ocorrer enquanto a "eitura ou gravao estiver sendo e4ecutada; o espao fina" em disco& enquanto gravamos& pode ser insuficiente ou pode ocorrer qua"quer outro prob"ema$ 2ara determinar se um erro ocorreu& podemos usar a funo ferror56$ /a" funo retorna verdadeiro se tiver ocorrido um erro durante a 1"tima operao no arquivo ou& caso contr*rio& retorna 0ero& e tem como 1nico argumento o ponteiro fi"e$ A funo perror56 tem como 1nico argumento a mensagem de erro que indica em que parte do programa ocorreu o erro$ A mensagem ' impressa& seguida da mensagem de erro do sistema$ if 5 ferror5fptr6 6 J perror5K-rro de gravao, M6; fc"ose5fptr6; e4it516; N 3$2Q - 7eitura e gravao em bai4o-n+ve" A "eitura e gravao em bai4o-n+ve" oferece somente duas funes, =rite56 e read56$ -m bai4o-n+ve"& os dados no podem ser "idos ou gravados como caracteres individuais& strings ou formatados como em a"to-n+ve"$ -4iste somente um modo de "er e gravar dados, por meio de um buffer cheio de dados$ !ravar ou "er um buffer comp"eto de dados se asseme"ha ^ maneira de "er e gravar b"ocos de bTtes em a"to-n+ve"$ -ntretanto& a "eitura e gravao no bufferi0ada& ou bai4o-n+ve"& obriga o programador a criar e manter o buffer de dados$ As funes no faro essa manuteno$ d* a"gumas vantagens em usar o modo no bufferi0ado& pois possibi"ita a criao de funes menores e mais r*pidas$ As funes de a"to-n+ve" foram criadas usando funes de bai4o-n+ve"$ eai4o-n+ve" ' o m'todo b*sico de "eitura e gravao$ As funes de bai4o-n+ve" podem acessar os arquivos de entrada padro& sa+da padro& e a sa+da de erros$ Arquivo 8dentificador >tdin Q >tdout 1 >tderr 2 @inc"ude Aio$hB CCpara read56 e =rite56 @inc"ude Astd"ib$hB @inc"ude Astring$hB main56 J char Dstr ; KUigite o seu nome, M; char nomeYWQZ; int eTtes7idos; =rite51&str&str"en5str66; CCimprime stdout eTtes7idos ; read5Q&nome&WQ6; CC7e de stdin nomeYeTtes7idos F 1Z ; a[Qb; str ; K>eu nome ' M; =rite51&str&str"en5str66; CC8mprime stdout =rite51&nome&str"en5nome66; N 3$21 - As funes =rite56 e read56 A funo =rite56 recebe 3 argumentos, o descritos do arquivo no qua" iremos gravar& o endereo do in+cio do buffer que queremos gravar e o n1mero de bTtes a serem gravados& e retorna o numero de bTtes rea"mente gravados$ A funo read56 recebe 3 argumentos, o descritos do arquivo no qua" iremos "er& o endereo do in+cio do buffer em que queremos co"ocar os dados "idos e o n1mero m*4imo de bTtes a serem "idos& e retorna o numero de bTtes rea"mente "idos$ . n1mero de bTtes rea"mente "idos ' importante& pois pode ser bem menor que o n1mero de bTtes especificado no terceiro argumento$ 3$22 - Fi4ando o tamanho do buffer -m bai4o-n+ve"& nossos programas devem manter a *rea de mem:ria em que os dados "idos do arquivo sero co"ocados$ -ssa *rea de mem:ria ' chamada de buffer$ @define /A_e)FF 1Q24 char buffY/A_e)FF F 1Z; . tamanho do buffer ' importante para uma operao eficiente$ Uependendo do sistema operaciona"& buffers de certos tamanhos so manuseados de modo mais eficiente que outros$ !era"mente& o tamanho :timo de buffer ' m1"tip"o de H12 bTtes$ 2ortanto& H12& 1Q24& 2Q4W ou 4QXO podem ser usados$ 3$23 - A funo open56 Antes de poder acessar um arquivo em bai4o-n+ve"& usamos a funo open56$ >eu primeiro argumento ' o nome comp"eto 5com caminho6 do arquivo que queremos abrir$ f* o segundo indica o modo em que o arquivo ser* acessado$ Cada modo ' indicado por uma constante chamada f"ag& cu(o va"or est* definido no arquivo fcnt"$h$ 2ara informar as nossas opes entre as possibi"idades de abertura do arquivo& devemos combinar m1"tip"os f"ags por meio do operador .# 5 g 6 6la( Si(nificado .hA22-%U 2osiciona o ponteiro de arquivo no fim de"e$ .hC#-A/ Cria o arquivo& caso no e4ista$ .h#U.%7i Abre o arquivo somente para "eitura$ .hR#.%7i Abre o arquivo somente para gravao$ .h#UR# Abre o arquivo somente para "eitura e gravao$ .h/#)%C Abre e trunca o conte1do de um arquivo e4istente para o tamanho 0ero$ .he8%A#i Abre arquivo no modo bin*rio$ .h/-c/ Abre arquivo no modo te4to$ A"gumas das possibi"idades "istadas so mutuamente e4c"usivas$ . terceiro argumento ' requerido somente quando .hC#-A/ ' especificado$ >e o arquivo (* e4istir& esse argumento ' ignorado$ Caso contr*rio& especifica os f"ags de permisso que sero se"ecionados quando o novo arquivo for gravado pe"a primeira ve0$ ?uando abrimos um arquivo com open56& as permisses se"ecionadas na criao do arquivo so ap"icadas$ -ssas permisses esto definidas no arquivo sTs[stat$h$ >h8#-AU, permisso somente para "eitura >h8R#8/-, permisso para gravao$ >h8#-AUg>h8R#8/-, permisso para "eitura e gravao 3$24 - . descritor de arquivo .bserve que o arquivo stdio$h& que era necess*rio em a"to-n+ve"& no o ' aqui$ Ao contr*rio de arquivos em a"to-n+ve" que usam um ponteiro fi"e para a comunicao entre o sistema operaciona" e o seu arquivo& em bai4o-n+ve" requer-se um descritor de arquivo$ >e tudo ocorrer com sucesso& a funo open56 retornar* um n1mero inteiro chamado descritor de arquivo$ Caso ocorra um erro& retornar* -1& e definir* a vari*ve" g"oba" errno com, -ACC->>, permisso de acesso negada --c8>/, arquivo (* e4iste -8%EA7, c:digo de acesso 5f"ags6 inv*"ido -_F87-, arquivos demais abertos -%.-%/, arquivo no e4iste 3$2H - A funo c"ose56 C"ose56 fecha o arquivo& "iberando& assim& as *reas de comunicao para serem usadas por outros arquivos& e tem como 1nico argumento o descritor do arquivo$ 3$2O - _ensagens de erros A funo perror56 ' usada para verificar o tipo de erro ocorrido$ if 5 5fd ; open5argvY1Z& .h#U.%7i g .he8%A#i66 A Q 6 J perror5K%o foi poss+ve" abrir o arquivo para "eituraIM6; -4it516; N 3$2V - A funo "see]56 e te""56 A funo "see]56 ' seme"hante ^ funo fsee]56& que permite movimentar a posio corrente de "eitura e gravao do arquivo para uma posio esco"hida$ A funo "see]56 aceita 3 argumentos$ . primeiro ' o descritor do arquivo$ . segundo ' o n1mero de bTtes que dese(amos des"ocar a partir da posio especificada pe"o terceiro argumento& chamado posio 5e4istem 3 possibi"idades, Q- in+cio do arquivo; 1-posio atua"; 2-fim do arquivo6$ A funo te""56 retorna a posio corrente de um arquivo 5em bTtes6& sempre a partir do in+cio do arquivo$ -ssa funo aceita um 1nico argumento j o descritor do arquivo j e retorna um va"or do tipo "ong& que representa o n1mero de bTtes do comeo do arquivo at' a posio atua"$ 3$2W - .perando com buffers A t'cnica de guardar o conte1do de um arquivo em um buffer proporciona v*rias vantagens$ 2odemos e4ecutar v*rias operaes nos dados do buffer sem ter de acessar o arquivo novamente$ A bib"ioteca C oferece a"gumas funes com a fina"idade de otimi0ar operaes em dados bufferi0ados$ 5vide e4emp"o p*gina 3V2& "ivro te4to6 %este e4emp"o& o arquivo ' aberto em modo te4to& que ' o modo padro e no necessita ser especificado$ 3$2X - Funes para manipu"ao de buffers, memchr56 e memcmp56 A funo memchr56 procura no buffer por um caractere espec+fico$ -sta funo tem 3 argumentos, o primeiro argumento ' o endereo do buffer onde queremos procurar; o segundo& ' o caractere a ser procurado; e o terceiro ' o tamanho do buffer a ser procurado$ A funo memchr56 retorna %)77& se no tiver encontrado o caractere; caso contr*rio& retorna um ponteiro para o caractere no buffer$ A funo memcmp56 procura por uma string$ -sta funo tem 3 argumentos, o ponteiro para o "ugar do buffer onde a comparao deve comear 5norma"mente& "oca"i0ado pe"o memchr56& primeiro caractere da string6; o endereo da frase a ser comparada e o comprimento da frase$ A funo compara& ento& a frase com os caracteres do buffer e& se for igua"& retorna Q$ As funes de manipu"ao de buffer requerem que o arquivo string$h se(a inserido no programa$ 3$3Q - !ravando arquivos em bai4o-n+ve" 2ara criar um novo arquivo& usamos o f"ag .hC#-A/$ Uesse modo& a funo open56 requer um terceiro argumento& a permisso 5para gravar, >h8R#8/-6$ if 5 5fdUest ; open5argvY2Z& .hC#-A/ g .h/#)%C g .hR#.%7i g .he8%A#i& >h8R#8/-66 A Q 6 J N 5vide e4emp"o p*gina 3V2& "ivro te4to6 3$31 - ?uando usar o qu3S 2e"a mu"tip"icidade de funes oferecidas para acessar arquivos em C& '& ^s ve0es& dif+ci" saber que m'todo usar$ 7eitura e gravao em a"to-n+ve" '& provave"mente& o mais va"ioso quando manuseamos dados como caracteres& strings ou formatados& como em printf56$ 7eitura e gravao em bai4o-n+ve" ' o m'todo mais natura" em situaes em que b"ocos de dados so traba"hados& como em matri0es$ -m muitos casos& a"to-n+ve" ' mais f*ci" de programar& enquanto bai4o-n+ve" gera um c:digo mais eficiente em termos de rapide0 e tamanho de c:digo e4ecut*ve"$ _odo te4to ' usado quando o arquivo cont'm te4to; e modo bin*rio& quando o arquivo pode conter n1meros e outros c:digos A>C88$ 8sso evita prob"emas de transformao errada de dados num'ricos$ Manipulao de arquivos )m arquivo ' um recurso manipu"ado pe"o sistema operaciona" ao qual a lin(ua(em de pro(rama+,o tem acesso$ P uma abstrao que permite acessar convenientemente dispositivos e4ternos de entrada e sa+da de dados$ -mbora tipicamente um arquivo se(a associado a um espao de arma0enamento em disco& outros dispositivos de entrada e sa+da so manipu"ados como arquivos& tais como o tec"ado e a te"a de um monitor$ )sua"mente& para traba"har com um arquivo& ele deve ser inicialmente a8erto$ >ua abertura indica ao sistema operaciona" que o arquivo ser* manipu"ado& de forma que informao que agi"i0a o acesso ao arquivo ' mantida em mem:ria$ Ap:s aberto& um arquivo ; acessado atrav's de um descritor& que basicamente indica onde o sistema operaciona" mant'm a informao sobre o arquivo$ %as descries de a"goritmos& o descritor est> associado a um tipo 6I2E$ A a8ertura de um arquivo ; o passo inicial para a rea"i0ao dessas operaes$ . ob(etivo dessa operao '& inicia"mente& tradu?ir um nome sim8@lico que identifica o arquivo para um descritor que o pro(rama pode manipular de forma mais eficiente$ %esse procedimento de abertura& ' necess*rio tamb'm verificar se quem dese(a rea"i0ar a manipu"ao do arquivo tem as autori0aes necess*rias$ 2ara rea"i0ar a abertura de um arquivo& o sistema operaciona" oferece uma rotina de servio que recebe pe"o menos um argumento que ' o nome do arquivo e retorna o descritor$ .utros argumentos que tipicamente esto presentes indicam o modo de operao do arquivo e aes que devem ser tomadas em a"gumas situaes espec+ficas$ . modo de operao ' designado como "eitura ou escrita& podendo adiciona"mente ser especificado se o conte1do deve ser tratado como seqk3ncias de caracteres 5modo te4to6 ou dados 5modo bin*rio6$ As indicaes de ao determinam& por e4emp"o& o que fa0er se o arquivo especificado para escrita no e4iste 5criar ou gerar erro6& ou caso o arquivo (* e4ista se o conte1do anterior deve ser sobrescrito 5truncate6 ou mantido 5append6$ 2or simp"icidade& o procedimento usado para abertura de arquivos nas descries de a"goritmo omitem o segundo argumento, #;P42JVP(): rece:e como argumento uma string com o nome do arquivo" retorna uma refer&ncia para 2JVP, que usada nas opera,-es de manipula,o do arquivo, ou o valor nulo em caso de falha na opera,o9 )ma ve0 que o arquivo este(a aberto& o sistema operaciona" mant'm em suas estruturas internas todas as informaes necess*rias para sua manipu"ao; essa informao ' obtida atrav's do descritor do arquivo$ 2or e4emp"o& quando um arquivo ' aberto para "eitura a llposio atua"mm para a pr:4ima operao ' o in+cio do arquivo$ Ao ler uma linha do arquivo% essa posi+,o ; atuali?ada para o inAcio da linha se(uinte e assim sucessivamente$ ?uando o arquivo no precisa mais ser manipu"ado& esses recursos mantidos pe"o sistema operaciona" podem ser "iberados$ %ovamente& uma rotina do sistema oferece esse servio& que ser* descrito nos a"goritmos pe"a rotina 1V#0P2JVP(): rece:e como argumento uma refer&ncia para 2JVP" no tem valor de retorno, mas simplesmente fecha o arquivo que havia sido a:erto com #;P42JVP()9 As rotinas de manipu"ao de conte1do que so uti"i0adas dependem do tipo de conte1do e do modo de operao do arquivo$ %o n+ve" mais b*sico& qua"quer arquivo pode ser visto como uma seqk3ncia de bTtes; nesse n+ve"& uma rotina de "eitura de um bTte e outra de escrita de um bTte devem e4istir$ A partir dessas& outras rotinas com n+ve" de abstrao mais a"to podem ser oferecidas$ 2ara a "eitura de arquivos te4to& duas rotinas so de interesse, PAM1dA(): rece:e como argumento uma refer&ncia para 2JVP" retorna o pr+imo car(ter do arquivo, ou um valor especial P#2 para sinalizar que a posi,o atual alcan,ou o fnal do arquivo9 PAMVJ4P(): rece:e como argumento uma refer&ncia para 2JVP" retorna a pr+ima linha do arquivo, ou o valor nulo se no houver pr+ima linha9 A Ta8ela ) apresenta as principais funes da "inguagem C para manipula+,o de arquivos$
Funo Ao fopen() Abre um arquivo Fclose () Fecha um arquivo putc() e fputc() Escreve um caractere em um arquivo #etc() e f#etc() L um caractere de um arquivo fsee*() Posiciona em um registro de um arquivo fprintf() Efetua impresso formatada em um arquivo fscanf() Efetua leitura formatada em um arquivo feof() Verifica o final de um arquivo fwrite() Escreve tipos maiores que 1 byte em um arquivo fread() L tipos maiores que 1 byte de um arquivo Ta8ela ) - 6un+Bes do padr,o ANSI para manipula+,o de arquivos
. sistema de entrada e sa+da do A%>8 C ' composto por uma s'rie de funes& cu(os prot:tipos esto reunidos em stdio.h $ /odas estas funes traba"ham com o conceito de <ponteiro de arquivo<$ -ste no ' um tipo propriamente dito& mas uma definio usando o comando tTpedef$ -sta definio tamb'm est* no arquivo stdio.h$ 2odemos dec"arar um ponteiro de arquivo da seguinte maneira,
FILE *Arquivo;
2e"a dec"arao anterior& passa a e4istir uma vari*ve" de nome %r"ui$o& que ' ponteiro para um arquivo$ . ponteiro de arquivo une o sistema de -C> a um .uffer$ . ponteiro no aponta diretamente para o arquivo em disco& mas cont'm informaes sobre o arquivo& inc"uindo nome& status 5aberto& fechado e outros6 e posio atua" sobre o arquivo$