Вы находитесь на странице: 1из 30

Arquivos

- 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 &registro'"
)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 ,

#include <stdio.h>
#include <conio.h>
'oid main # (
FILE *&rqui'o;
char 3ome4567;
char Caractere;
clrscr #;
printf !3ome do arqui'o8 !#;
fflushstdin#;
1ets 3ome#;

&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

@* pro1rama e$emplo com fprintf *@

#include <stdio.h>
#include <conio.h>
#include <strin1.h>

'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

#include <stdio.h>
#include <conio.h>
#include <strin1.h>

#define LE*B&I A6

'oid main# (
FILE *arqfunc;
char se$o" au$;
int codfunc" idade" i = 6;
float salario;

clrscr#;
arqfunc = fopen!F93CI,3&.F&F!" !r!#;

if arqfunc == 39LL# (
printf!)n&rqui'o F93CI,3&.F&F nao pode ser a.erto.!#;
printf!)nErro 0ra'e ; *ecle al1o ;!#;
1etch#;
2
else (
au$ = fscanfarqfunc" !:d :c :d :f!"Gcodfunc" Gse$o" Gidade" Gsalario#;
while au$ ;= E,F# (
i = i C <;
printf!)n Fados do :d J funcionario / )n !" i#;
printf!)n Codi1o / :d Ie$o / :c!" codfunc" se$o#;
printf!)n Idade .../ :d Ialario / :K.5f!" idade" salario#;
printf!)n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% *ecle
al1o ;!#;
1etch#;
au$ = fscanfarqfunc" !:d :c :d :f!"Gcodfunc" Gse$o" Gidade"
Gsalario#;
2

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


-4emp"os ,

! P3!/3AMA A<AIX! C3IA "M A39"I4! E /3A4A !S A!S NESTE A39"I4!

#include <stdio.h>
#include <conio.h>

#define LE*B&I M6
struct *cliente (
char situacao; @@ situacao do re1istro / e$cluido ou nao 8
int codi1o; @@ codi1o do suNeito
char nomecli4LE*B&I7; @@ nome do suNeito
char fone 4<M7; @@ fone do suNeito
char se$o; @@ se$o
float limite; @@ limite de credito
2;

@@ prototipos
'oid Entrada FILE *#;
char OalidaIe$o#;
char Oalidaresp#;

@@ =================================================================
'oid main# (
FILE *cliente;
char 'erro = >3>;
char arqcli 47 = (!CLIE3*E.F&F!2;

cliente = fopenarqcli" !r.C!#;
if cliente == 39LL# (
printf! )n &rqui'o :s 3ao e$iste / *ecle al1o para criar a1ora ; !"
arqcli#;
1etch#;

if cliente = fopenarqcli" !w.C!## == 39LL# (
'erro = >I>;
printf! )n Erro 1ra'e ; 3ao consi1o criar o arqui'o :s ;;;!"
arqcli#;
1etch#;
2
2

if 'erro == >3># (
Entradacliente#;
fclose cliente#;
2
2

@@ entrada de dados 1ra'ando direto em arqui'o
'oid Entrada FILE * cliente# (
int retorno;
struct *cliente Ocli;
char 'resp;

do (
clrscr#;
printf!)n Fi1ite o Codi1o 4Dero encerra7 / ! #;
scanf!:d!" GOcli.codi1o#;
if Ocli.codi1o ;= 6# (
printf! )n Fi1ite o nome / !#;
fflushstdin#;
1etsOcli.nomecli#;
Ocli.se$o = OalidaIe$o#;
printf! )n Fi1ite o Fone / ! #;
1etsOcli.fone#;
printf! )n Fi1ite o Limite de Credito do cliente / !#;
scanf!:f!" GOcli.limite#;
'resp = Oalidaresp#;
if 'resp == >I># (
retorno = fwrite (&Vcli, sizeof(struct Tcliente) ,1,cliente)
!! fwrite retorna a "uantidade de itens #ra$ados (N%& '(TE))
if retorno == <# (
printf! )n 0ra'acao oP ; !#;
1etch#;
2
else (
printf ! )n Qro.lemas / 0ra'acao nao efetuada ;;;! #;
1etch#;
2
2
2
2 while Ocli.codi1o ;= 6#;
2
@@ 'alidar o se$o
char OalidaIe$o# (
char 'se$o;
do (
printf! )n Fi1ite o Ie$o 4H ou F7 / ! #;
'se$o = 1etche#;
2 while 'se$o ;= >F> GG 'se$o ;= >H>#;
return 'se$o;
2

@@ 'alidar a respostar
@@ 'alidar o se$o
char Oalidaresp# (
char 'resp;
do (
printf! )n Confirma Inclusao 4I ou 37 8 ! #;
'resp = 1etche#;
2 while 'resp ;= >I> GG 'resp ;= >3>#;
return 'resp;
2
! P3!/3AMA A<AIX! A<3E "M A39"I4! E IMP3IME !S A!S NA TE2A

#include <stdio.h>
#include <conio.h>

#define LE*B&I M6
struct *cliente (
char situacao; @@ situacao do re1istro / e$cluido ou nao 8
int codi1o; @@ codi1o do suNeito
char nomecli4LE*B&I7; @@ nome do suNeito
char fone 4<M7; @@ fone do suNeito
char se$o; @@ se$o
float limite; @@ limite de credito
2;

@@ prototipos
'oid LeRImprime FILE *#;

'oid main# (
FILE *cliente;
char 'erro = >3>;
char arqcli 47 = (!CLIE3*E.F&F!2;

if cliente = fopenarqcli" !r.!## == 39LL# (
'erro = >I>;
printf! )n Erro 0ra'e / &rqui'o 3ao e$iste ;!#;
1etch#;
2

if 'erro == >3># (

LeRImprimecliente#;

fclose cliente#;
2

2


@@ Le dados de um arqui'o e imprime na *ela
'oid LeRImprime FILE * cliente# (
int retorno" cont = 6;
struct *cliente Ocli;

retorno = freadGOcli" si?eofstruct *cliente#" <" cliente#;
@@ fread retorna a quantidade de itens retornados ...
clrscr#;
while retorno == <# (
contCC;
printf!)n)n F&F,I F, CLIE3*E :d )n!" cont#;
printf!)n Codi1o / :d!" Ocli.codi1o#;
printf!)n 3ome ../ :s!" Ocli.nomecli#;
printf!)n Ie$o ../ :c!" Ocli.se$o#;
printf!)n Fone ../ :s!" Ocli.fone#;
printf!)n Limite / :.5f!" Ocli.limite#;
retorno = fread(&Vcli, sizeof(struct Tcliente), 1, cliente)

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$

Вам также может понравиться