Fluxos de arquivos
O
trabalho com arquivos ´e fundamental na programac¸˜ao de computadores. Por interm´edio dos arquivos consegue-se elaborar programas que produzem informac¸˜oes permanentes no computa-dor. Informac¸˜oes estas que podem ser alteradas e ou exclu´ıdas ao longo do tempo, por meio do armazenamento dos dados em discos (mem´oria secund´aria) na forma de arquivos.O conceito de arquivo existe no cotidiano nosso. ´E bastante normal a utilizac¸˜ao de arquivos para armazenar grandes quantidades de informac¸˜oes, por um grande per´ıodo de tempo, tais como, os arquivos mantidos por uma companhia telefˆonica, agenda de telefones, as informac¸˜oes de pacientes em um hospital eetc.
Um arquivo ´e um conjunto (colec¸˜ao) de registros (de uma estrutura de dados). Cada registro ocupa uma posic¸˜ao fixa dentro do arquivo e os registros s˜ao estruturas formadas por um conjunto de informac¸˜oes chamadas de campos.
Um exemplo de arquivo do dia a dia de uma universidade, por exemplo, seria o arquivo de uma biblioteca que possui o cat´alogo dos livros existentes. Para isso tem-se uma ficha do livro, exemplificada na Figura 4.1, onde tem-se as informac¸˜oes sobre o livro, tais como,C´odigo do
livro,T´ıtulo,Autor,Assunto,EditoraeAno.
Figura 4.1: Exemplo de uma ficha de descric¸˜ao de um livro.
Cada ficha de um livro seria um registro e cada registro do livro possui seis campos que s˜ao:
C´odigo do livro,T´ıtulo,Autor,Assunto,EditoraeAno.
Quando todas as fichas (registros) dos livros estiverem juntas em um mesmo local (um ar-quivo de ac¸o) formando o arar-quivo da biblioteca e podendo ser manipulado para consulta, para atualizac¸˜ao de livros novos ou remoc¸˜ao de algum livro da biblioteca, utilizam-se um arquivo de fichas. Como pode ser visto na Figura 4.2.
Figura 4.2: Exemplo de um arquivo de fichas.
4.1
Representac¸˜ao de registros
Para representar um registro na linguagem C, utiliza-se estruturas e uni˜oes quando necess´ario. Com base no exemplo anterior, o arquivo da biblioteca, cada ficha de um livro constante em um arquivo f´ısico de ac¸o, onde todas as fichas s˜ao guardada. Cada ficha ´e o registro de um livro que cont´em campos (C´odigo do livro, T´ıtulo,Autor, Assunto,EditoraeAno). Para representar este registro na linguagem C tem-se:
s t r u c t LIVRO { i n t c o d i g o ; char t i t u l o [ 3 5 ] ; char a u t o r [ 4 0 ] ; char a s s u n t o [ 3 5 ] ; char e d i t o r a [ 3 0 ] ; i n t ano ;
A estrutura LIVRO ´e an´aloga ao registro livro (ficha do arquivo) onde os seu elementos
(C´odigo do livro, T´ıtulo, Autor, Assunto, Editora e Ano) correspondem aos
4.2
Fluxo de arquivos de dados
A linguagem C n˜ao possui comandos de entrada e sa´ıda. O trabalho todo relacionado `a manipulac¸˜ao de arquivos se d´a por meio de func¸˜oes da biblioteca padr˜ao. Este tipo de abor-dagem garante ser um sistema bastante poderoso e flex´ıvel.
Na linguagem c existem duas maneiras de tratar arquivos. Primeiro o sistema ANSI com buffer1, tamb´em chamado de formatado ou alto n´ıvel e um segundo sistema UNIX sem buffer, tamb´em chamado de n˜ao formatado.
O sistema de entrada e sa´ıda na linguagem C torna os diversos detalhes dos dispositivos reais transparentes para o programador, conferindo uma maior portabilidade.
As func¸˜oes de entrada e sa´ıda trabalham sobre fluxos arquivos2. Os fluxos arquivos podem ser conectados `a dispositivos reais, sendo considerados como arquivos. Um fluxo de arquivo ´e uma sequˆencia de dados e existem dois tipos:
• Os fluxos de arquivo de dados TEXTO que s˜ao sequˆencias de caracteres ASCII, muitas vezes linhas terminadas com uma nova linha (caractere ’\n’).
• Os fluxos de arquivo de dados BIN ´ARIOS que s˜ao sequˆencias debytes em estado bruto, n˜ao ocorrendo nenhuma traduc¸˜ao.
A maior parte das func¸˜oes de entrada e sa´ıda s˜ao projetadas para operar sobre um fluxo de arquivo. Estes fluxo de arquivos garantem a flexibilidade podendo ser atribu´ıdos `a diferentes dispositivos reais. Algumas dessas conex˜oes j´a est˜ao constru´ıdas quando o programa ´e iniciado. Tem-se cinco fluxos de arquivos padronizados, definidos e conectados aos v´arios dispositivos f´ısicos existentes. A Tabela 4.1 apresenta estes fluxos de arquivos.
Fluxo de arquivos Conex˜ao
stdout monitor
stdin teclado
stdprn impressora
stdaux monitor
stderr monitor
Tabela 4.1: Os fluxos arquivos padronizados, definidos e conectados aos v´arios dispositivos f´ısicos existentes.
Para manipular arquivos precisam-se das seguintes etapas:
1. Abrir o fluxo de arquivo.
2. Verificar se o fluxo de arquivo foi aberto corretamente.
3. Se o fluxo de arquivo aberto corretamente ler e ou gravar no fluxo de arquivo.
4. Fechar o fluxo de arquivo.
Abrir o fluxo de arquivo : significa criar um fluxo de dados (TEXTO ou BIN ´ARIO) para poder em seguida gravar e ou ler dados no fluxo de arquivo por meio do dispositivo de fluxo de dados criado (aberto). Ap´os a manipulac¸˜ao o fluxo de dados deve ser fechado (fechar o fluxo de arquivo). Para realizar tais tarefas com os fluxos de dados, existem, na biblioteca padr˜ao, func¸˜oes que ser˜ao brevemente comentadas na sequˆencia.
Para abrir um fluxo de arquivo ´e necess´ario criar um fluxo de dados e este fluxo ´e criado por interm´edio da declarac¸˜ao de um ponteiro para uma estrutura para fluxos de dados de controle de arquivo3 j´a definida na biblioteca padr˜aostdio.h. A t´ıtulo de curiosidade segue a definic¸˜ao desta estrutura:
t y p e d e f s t r u c t {
s h o r t l e v e l ; u n s i g n e d f l a g s
char f d ;
u n s i g n e d char h o l d ; s h o r t b s i z e ;
u n s i g n e d char ∗b u f f e r , ∗c u r p ; u n s i g n e d i s t e m p ;
s h o r t t o k e n ; } FILE ;
O sinalizador de estatus do fluxo de arquivo4 e dado pelo formato F XXX. A Tabela 4.2 apresenta os sinalizadores de estatus do fluxo de arquivo.
Antes de abrir um fluxo de arquivo ´e necess´ario declarar o fluxo de arquivo como sendo do tipoFILE, da seguinte maneira:
FILE ∗a r q u i v o ;
Onde*arquivo ´e um ponteiro para um tipo definido de estrutura da biblioteca padr˜ao FILE. Vale lembrar que n˜ao ´e preciso preocupar-se em saber detalhes da estruturaFILE e seus sinalizadores de estatus de fluxo de arquivo (Tabela 4.2). Estas informac¸˜oes s˜ao transparentes para o programador, a completa e total manipulac¸˜ao fica a cargo internamente das func¸˜oes da biblioteca padr˜ao que tratar´a dos arquivos.
Ap´os a declarac¸˜ao do ponteiro *arquivo do tipo FILE deve-se abrir o arquivo utilizando-se da func¸˜aofopenque possui o prot´otipo:
FILE ∗f o p e n (c o n s t char ∗n o m e d o a r q u i v o , c o n s t char ∗modo ) ;
Nome Significado F RDWR leitura e escrita
F READ arquive somente de leitura F WRIT arquivo somente de escrita F BUF buffer de dados alocado F LBUF buffer de linha do arquivo F ERR indicador de erro
F EOF indicador de fim de arquivo F BIN indicador de arquivo bin´ario
F IN dado est´a entrando
F OUT monitor saindo
F TERM arquivo ´e um terminal
Tabela 4.2: Sinalizadores de estatus do fluxo de arquivo.
Onde a func¸˜aofopenrecebe como parˆametros duas sequˆencias de caracteres que seriam o nome do arquivo e o modo que determina como o arquivo vai ser aberto (leitura, escrita, leitura e escrita, leitura ou escrita). A Tabela 4.3 mostra os modos de abertura dos arquivos e seus respectivos significados.
Modo Significado
r Abre um arquivo texto para leitura w Cria um arquivo texto para escrita
a Anexa a um arquivo texto
rb Abre um arquivo bin´ario para leitura wb Cria um arquivo bin´ario para escrita ab Anexa a um arquivo bin´ario
r+ Abre um arquivo texto para leitura w+ Cria um arquivo bin´ario para escrita
a+ Abre um arquivo bin´ario para leitura e ou escrita r+b Abre um arquivo bin´ario para leitura e ou escrita w+b Cria um arquivo bin´ario para leitura e ou escrita a+b Anexa a um arquivo bin´ario para leitura e ou escrita
Tabela 4.3: Modos de abertura dos fluxos de arquivos e seus respectivos significados.
Por exemplo:
a r q u i v o = f o p e n ( ” t e s t e . t x t ” , ”w” ) ;
Esse valor retornado para a vari´avelarquivonunca deve ser alterado. Caso acontec¸a al-gum erro na abertura do fluxo de arquivo, tais como, diret´orio n˜ao existe, nome do arquivo errado, n˜ao tem permiss˜ao para leitura e ou escrita eetca func¸˜aofopenretornar´aNULL (nulo, zero).
Verificar se o fluxo de arquivo foi aberto : devido ao retorno da func¸˜aofopen, deve-se SEM-PRE fazer um teste para a verificac¸˜ao da abertura do fluxo de arquivo, conforme o frag-mento de c´odigo a seguir:
i f ( ! a r q u i v o ) {
p e r r o r ( ” E r r o : ” ) ; e x i t ( 1 ) ;
}
J´a que n˜ao conseguiu abrir o arquivo da-se uma mensagem de erro e, neste caso, sai do programa.
O c´odigo escrito anteriormente pode ser reescrito de uma outra maneira utilizando a func¸˜ao fopenj´a no comando de selec¸˜aoif, da seguinte maneira:
i f ( ! ( a r q u i v o = f o p e n ( ” t e s t e . t x t ” , ”w” ) ) ) { p e r r o r ( ” E r r o : ” ) ;
e x i t ( 1 ) ; }
Se fluxo de arquivo aberto corretamente ler e ou gravar no fluxo de arquivo : isto significa que se pode ler e ou escrever informac¸˜oes no fluxo de arquivo aberto (ler e ou escrever quantidades debytes).
Para ler e ou escrever tem-se as seguintes func¸˜oes da biblioteca padr˜ao: fscanf,
fprintf,fread,fwrite,fgets,fputs,fgetcefputc.
i n t f s c a n f ( FILE ∗a r q u i v o , c o n s t char ∗f o r m a t o , . . . )
Lˆe dados formatados do fluxo de arquivo. Recebe como parˆametros um enderec¸o para um tipoFILEe o formato (segue o padr˜ao a func¸˜aoscanf). A func¸˜ao retorna o n´umero de item lidos.
Exemplo: o programa a seguir lˆe de um fluxo de arquivo do tipo TEXTO trˆes valores pr´e formatados como inteiros. O fluxo de arquivo numeros.txt tem que ter pelo menos trˆes valores na mesma linha, separados por espac¸os ou cada um valor em uma linha.
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t d l i b . h>
i n t main ( ) {
/ / d e c l a r a o f l u x o de a r q u i v o e j ´a a b r e o f l u x o de a r q u i v o
i n t a1 , a2 , a3 ;
/ / v e r i f i c a s e a b r i u c o r r e t a m e n t e
i f ( ! a r q u i v o ) { p e r r o r ( ” E r r o : ” ) ; g e t c h a r ( ) ;
e x i t ( 1 ) ; }
/ / l ˆe t r ˆe s d a d o s f o r m a t a d o s do f l u x o de a r q u i v o
f s c a n f ( a r q u i v o , ”%i %∗c%i %∗c%i %∗c ” ,& a1 ,& a2 ,& a3 ) ;
/ / m o s t r a o c o n t e ´u d o l i d o do f l u x o de a r q u i v o
p r i n t f ( ”{%i ,% i ,% i}” , a1 , a2 , a3 ) ; f c l o s e ( a r q u i v o ) ;
r e t u r n 0 ; }
i n t f p r i n t f ( FILE ∗a r q u i v o , c o n s t char ∗f o r m a t o , . . . )
Escreve dados formatados no fluxo de arquivo. Recebe como parˆametros um enderec¸o para um tipo FILEe o formato (segue o padr˜ao a func¸˜ao printf). A func¸˜ao retorna o n´umero de item escritos.
Exemplo: o programa a seguir lˆe trˆes nomes e grava-os no fluxo de arquivo do tipo TEXTO chamadomeu-arquivo.txt, produzindo um fluxo de arquivo com trˆes linhas.
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t d l i b . h>
i n t main ( ) { FILE ∗a r q u i v o ;
i n t n ;
char nome [ 1 2 8 ] ;
/ / a b r e o f l u x o de a r q u i v o
/ / v e r i f i c a s e a b r i u c o r r e t a m e n t e
i f ( ! ( a r q u i v o = f o p e n ( ”meu−a r q u i v o . t x t ” , ”w” ) ) ) { p e r r o r ( ” E r r o : ” ) ;
g e t c h a r ( ) ; e x i t ( 1 ) ; }
/ / l ˆe t r ˆe s nomes e g r a v a no f l u x o de a a r q u i v o
f o r ( n = 1 ; n < 4 ; n ++) {
p e r r o r ( ” E r r o : ” ) ; g e t s ( nome ) ;
f c l o s e ( a r q u i v o ) ; / / f e c h a o f l u x o de a r q u i v o
r e t u r n 0 ; }
char ∗f g e t s (char ∗s t r i n g , i n t n u m e r o d e b y t e s , FILE ∗a r q u i v o )
Lˆe uma sequˆencia de caracteres do fluxo de arquivo em na vari´avel string at´e (numero de bytes - 1) caracteres lidos ou tamb´em um caractere de linha nova ou o final do arquivo tenha sido alcanc¸ado, o que vier primeiro. Retorna o enderec¸o do 1o
byteda vari´avelstring
i n t f p u t s (c o n s t char ∗s t r i n g , FILE ∗a r q u i v o )
Escreve uma sequˆencia de caracteres no fluxo de arquivo. A func¸˜ao escreve o conte´udo da vari´avelstringat´e encontrar o caractere nulo (‘\0’). Retorna um valor n˜ao negativo se consegui escrever sen˜ao um fim de arquivo.
O exemplo a seguir abre dois fluxos de arquivos no modo TEXTO, um s´o para leitura e o outro s´o para escrita. O programa lˆe linha a linha do fluxo de entrada por interm´edio da func¸˜ao fgetsque lˆe uma linha inteira e escreve o conte´udo da linha no fluxo de sa´ıda no arquivosaida.txtpor interm´edio da func¸˜aofputsque escreve a linha lida com a func¸˜aofgets. O programa faz isso at´e encontrar o fim do fluxo de arquivo de entrada. A verificac¸˜ao do fim do fluxo de arquivo ´e feito por interm´edio da func¸˜ao feofque tem o seguinte prot´otipo:
i n t f e o f ( FILE ∗a r q u i v o )
que recebe o enderec¸o de um tipoFILE e retorna um valor diferente de zero caso tenha encontrado o final do fluxo de arquivo. Caso contr´ario um valor igual a zero ´e retornado.
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t d l i b . h>
i n t main ( ) {
FILE ∗e n t r a d a , ∗s a i d a ; char s t r i n g [ 1 2 8 ] ;
/ / a b r e o f l u x o de a r q u i v o de
i f ( ! ( e n t r a d a = f o p e n ( ” f p r i n t f . cpp ” , ” r ” ) ) ) { p e r r o r ( ” E r r o : ” ) ;
g e t c h a r ( ) ; e x i t ( 1 ) ; }
/ / a b r e o f l u x o de a r q u i v o de e s c r i t a
g e t c h a r ( ) ; e x i t ( 1 ) ; }
w h i l e ( 1 ) {
/ / l ˆe uma l i n h a do f l u x o de a r q u i v o
f g e t s ( s t r i n g , s i z e o f( s t r i n g ) , e n t r a d a ) ;
/ / v e r i f i c a s e f i m de f l u x o de a r q u i v o
i f ( f e o f ( e n t r a d a ) )
break; / / s a i do w h i l e ( 1 )
/ / e s c r e v e uma l i n h a no f l u x o de a q u i v o
f p u t s ( s t r i n g , s a i d a ) ; }
f c l o s e ( e n t r a d a ) ; / / f e c h a o f l u x o de a r q u i v o de l e i t u r a
f c l o s e ( s a i d a ) ; / / f e c h a o f l u x o de a r q u i v o de e s c r i t a
r e t u r n 0 ; }
i n t f g e t c ( FILE ∗a r q u i v o ) ]
Lˆe um caractere do fluxo de arquivo retornando o caractere em um tipo inteiro. O retorno da func¸˜ao ´e o caractere lido do fluxo de arquivo ou um final de arquivo.
i n t f p u t c (i n t c a r a c t e r e , FILE ∗a r q u i v o )
Escreve um caractere no fluxo de arquivo retornando o caractere escrito no fluxo e arquivo ou um final de arquivo.
Exemplo: o programa a seguir abre um fluxo de arquivo do tipo TEXTO para leitura e um fluxo de arquivo do tipo TEXTO para escrita e realiza a c´opia do conte´udo de um arquivo para um outro arquivo caractere por caractere at´e encontrar o um final de fluxo de arquivo de leitura.
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t d l i b . h>
i n t main ( ) {
FILE ∗e n t r a d a , ∗s a i d a ; char c a r a c t e r e ;
/ / a b r e e v e r i f i c a o f l u x o de a r q u i v o de l e i t u r a
i f ( ! ( e n t r a d a = f o p e n ( ” k t o f . cpp ” , ” r ” ) ) ) { p e r r o r ( ” E r r o : ” ) ;
g e t c h a r ( ) ; e x i t ( 1 ) ; }
i f ( ! ( s a i d a = f o p e n ( ” s a i d a . $$$ ” , ”w” ) ) ) { p e r r o r ( ” E r r o : ” ) ;
g e t c h a r ( ) ; e x i t ( 1 ) ; }
w h i l e ( 1 ) {
/ / l ˆe um c a r a c t e r e do f l u x o de a r q u i v o de l e i t u r a
c a r a c t e r e = f g e t c ( e n t r a d a ) ;
/ / v e r i f i c a s e ´e f i m de f l u x o de l e i t u r a
i f ( f e o f ( e n t r a d a ) ) break;
/ / e s c r e v e um c a r a c t e r e no f l u x o de a r q u i v o de e s c r i t a
f p u t c ( c a r a c t e r e , s a i d a ) ; }
f c l o s e ( e n t r a d a ) ; / / f e c h a o f l u x o de a r q u i v o de l e i t u r a
f c l o s e ( s a i d a ) ; / / f e c h a o f l u x o de a r q u i v o de e s c r i t a
r e t u r n 0 ; }
s i z e t f w r i t e (c o n s t v o i d ∗p o n t e i r o ,
s i z e t tamanho , s i z e t q u a n t i d a d e , FILE ∗a r q u i v o )
Escreve um conjunto de bytes na quantidade especificada na vari´avel quantidade a partir do enderec¸o de mem´oria apontado pela vari´avel ponteiro. O n´umero total de bytesescrito no fluxo de arquivo ´etamanho×quantidade. A func¸˜ao retorna o n´umero debytesescrito no fluxo de arquivo.
Exemplo:
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t d l i b . h>
t y p e d e f s t r u c t {
char nome [ 6 4 ] ; s h o r t i n t i d a d e ; f l o a t a l t u r a ; } REGISTRO ;
i n t main ( ) {
REGISTRO r e g i s t r o ; FILE ∗a r q u i v o ; char c a r a c t e r e ;
/ / a b r e e v e r i f i c a o f l u x o de a r q u i v o de e s c r i t a
g e t c h a r ( ) ; e x i t ( 1 ) ; }
w h i l e ( 1 ) {
p r i n t f ( ”\nNome : ” ) ; / / l ˆe o nome
g e t s ( r e g i s t r o . nome ) ;
/ / ENTER no nome e n c e r r a o programa
i f ( ! r e g i s t r o . nome [ 0 ] ) break;
p r i n t f ( ” I d a d e : ” ) ; / / l ˆe a i d a d e
s c a n f ( ”%i %∗c ” ,& r e g i s t r o . i d a d e ) ; p r i n t f ( ” A l t u r a : ” ) ; / / l ˆe a a l t u r a
s c a n f ( ”%f%∗c ” ,& r e g i s t r o . a l t u r a ) ;
p r i n t f ( ”\n−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” ) ;
/ / e s c r e v e no f l u x o de a r q u i v o o REGISTRO
f w r i t e (& r e g i s t r o , s i z e o f( REGISTRO ) , 1 , a r q u i v o ) ; }
f c l o s e ( a r q u i v o ) ; / / f e c h a o f l u x o de a r q u i v o
r e t u r n 0 ; }
s i z e t f r e a d (c o n s t v o i d ∗p o n t e i r o ,
s i z e t tamanho , s i z e t q u a n t i d a d e , FILE ∗a r q u i v o )
Lˆe um conjunto debytesna quantidade especificada na vari´avelquantidadea partir do enderec¸o de mem´oria apontado pela vari´avelponteiro. O n´umero total debyteslido no fluxo de arquivo ´e tamanho×quantidade. A func¸˜ao retorna o n´umero debytes lido fluxo de arquivo.
Exemplo:
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t d l i b . h>
t y p e d e f s t r u c t {
char nome [ 6 4 ] ; s h o r t i n t i d a d e ; f l o a t a l t u r a ; } REGISTRO ;
i n t main ( ) {
REGISTRO r e g i s t r o ; FILE ∗a r q u i v o ; char c a r a c t e r e ;
i f ( ! ( a r q u i v o = f o p e n ( ” r e g i s t r o s . d a t ” , ” r ” ) ) ) { p e r r o r ( ” E r r o : ” ) ;
g e t c h a r ( ) ; e x i t ( 1 ) ; }
w h i l e ( 1 ) {
/ / l ˆe do f l u x o de a r q u i v o um REGISTRO
f r e a d (& r e g i s t r o ,s i z e o f( REGISTRO ) , 1 , a r q u i v o ) ;
/ / ENTER no nome e n c e r r a o programa
i f ( f e o f ( a r q u i v o ) ) break;
p r i n t f ( ”\nNome : [% s ] ” , r e g i s t r o . nome ) ; p r i n t f ( ”\n I d a d e : [% i ] ” , r e g i s t r o . i d a d e ) ; p r i n t f ( ”\n A l t u r a : [ % . 2 f ] ” , r e g i s t r o . a l t u r a ) ; p r i n t f ( ”\n−−−−−−−−−−−−−−−−−−−−−−−−−−−−−” ) ; g e t c h a r ( ) ;
}
f c l o s e ( a r q u i v o ) ; / / f e c h a o f l u x o de a r q u i v o
r e t u r n 0 ; }
Fechar fluxo de arquivo : para fechar o fluxo de arquivo ´e necess´ario chamar a func¸˜aofclose que recebe como parˆametro o enderec¸o para um fluxo de arquivo associado e retorna0se consegui fechar o fluxo de arquivo.:
i n t f c l o s e ( FILE ∗a q u i v o )
Todo fluxo de arquivo aberto possui um ponteiro para uma mem´oria interna (buffer) do fluxo de dados. Isto pode ser observado na estrutura FILE por interm´edio do campo (elemento)curp5posic¸˜ao corrente no fluxo de dados, conforme vais-se lendo informac¸˜oes do arquivo essa posic¸˜ao corrente vai sendo incrementada. Tamb´em existe a necessidade de alterar a posic¸˜ao corrente conforme as necessidades de leitura e ou escrita no arquivo. Para isto existem algumas func¸˜oes especificas da biblioteca padr˜ao ´uteis que seriam: ftell,
fseek,rewind,renameeremove.
i n t f s e e k ( FILE ∗a r q u i v o , l o n g i n t d e s v i o , i n t d a o n d e )
Define a posic¸˜ao corrente associado a um fluxo de arquivo para a nova posic¸˜ao adicionando o valor do desvio a uma posic¸˜ao especificada de origem que pode ser a partir do in´ıcio do fluxo de arquivo (SEEK SET), a partir da posic¸˜ao corrente do ponteiro para o fluxo de arquivo (SEEK CUR) e a partir da da posic¸˜ao final do fluxo de arquivo (SEEK END). A func¸˜aofseekrecebe como parˆametros o enderec¸o de um tipoFILE, um inteiro longo que significa o desvio (deslocamento) e uma posic¸˜ao associadas ao in´ıcio, posic¸˜ao corrente
ou fim do fluxo de arquivo. A func¸˜ao retorna zero se conseguiu posicionar com sucesso a nova posic¸˜ao corrente do fluxo de arquivo, caso contr´ario um valor diferente de zero.
# i n c l u d e <s t d i o . h>
# i n c l u d e <s t d l i b . h>
/ / f u n c¸ ˜a o p a r a a b i r um a r q u i v o
FILE ∗A b r i r A r q u i v o (char ∗n o m e a r q u i v o , char ∗modo ) { FILE ∗a = f o p e n ( n o m e a r q u i v o , modo ) ;
i f ( ! a ) {
p e r r o r ( ” E r r o : ” ) ; e x i t ( 1 ) ;
}
r e t u r n a ; }
i n t main ( ) {
char s t r i n g [ 1 2 8 ] ;
FILE ∗a r q u i v o = A b r i r A r q u i v o ( ” t e s t e . t x t ” , ”w” ) ;
/ / e s c r e v e no f l u x o de a r q u i v o
f p u t s ( ” u n i v e r s i d a d e f e d e r a l de m i n a s g e r a i s ” , a r q u i v o ) ;
/ / p o s i c i o n a a p a r t i r do i n i c i o do a r q u i v o 13 b y t e s
f s e e k ( a r q u i v o , 1 3 , SEEK SET ) ;
f p u t s ( ”FEDERAL” , a r q u i v o ) ; / / e s c r e v e no f l u x o de a r q u i v o / / p o s i c i o n a a p a r t i r do i n ´ı c i o do f i m do a r q u i v o −6 b y t e s
f s e e k ( a r q u i v o ,−6 ,SEEK END ) ;
f p u t s ( ”GERAIS” , a r q u i v o ) ; / / e s c r e v e no f l u x o de a r q u i v o
f c l o s e ( a r q u i v o ) ; / / f e c h a o f l u x o de a r q u i v o
}
l o n g i n t f t e l l ( FILE ∗a r q u i v o )
Apanha a posic¸˜ao corrente no fluxo de arquivo. Para fluxo de arquivos bin´arios, o valor retornado corresponde o n´umero de bytes do in´ıcio do fluxo de arquivo. Para fluxo de arquivos de texto n˜ao ´e garantido ser o n´umero exato de bytesdo inicio do arquivo, mas o valor retornado pode at´e ser utilizado para restaurar o indicador de posic¸˜ao usando a func¸˜aofseek. A func¸˜aoftellrecebe como parˆametro um fluxo de arquivo e retorna um valor inteiro longo referente a posic¸˜ao corrente a partir do in´ıcio. Se ocorreu algum erro a func¸˜ao retorna um−1L.
v o i d r e w i n d ( FILE ∗a r q u i b o )
Posiciona o indicador de posic¸˜ao corrente de um fluxo de arquivo no in´ıcio. Esta func¸˜ao ´e equivalente a: fseek(arquivo,0L,SEEK SET). Em fluxos abertos para atualizac¸˜ao (read+write) a chamada da func¸˜aorewindpermite trocar entre leitura e escrita.
# i n c l u d e <s t d l i b . h>
i n t main ( ) { i n t n ;
FILE ∗a r q u i v o ; char b u f f e r [ 3 2 ] ;
/ / a b r i r e v e r i f i c a r o f l u x o de a r q u i v o
i f ( ! ( a r q u i v o = f o p e n ( ” t e s t e . $$$ ” , ”w+ ” ) ) ) { p e r r o r ( ” E r r o : ” ) ;
e x i t ( 1 ) ; }
/ / g r a v a r o s c a r a c t e r e s de ’A ’ a ’ Z ’
f o r ( n = ’A ’ ; n <= ’Z ’ ; n ++)
f p u t c ( n , a r q u i v o ) ;
/ / p o s i c i o n a r no i n i c i o do f l u x o de a r q u i v o
r e w i n d ( a r q u i v o ) ;
/ / l e r 1 b y t e 26 v e z e s
f r e a d ( b u f f e r , 1 , 2 6 , a r q u i v o ) ;
b u f f e r [ 2 6 ] = ’\0 ’ ; / / f i n a l de s t r i n g
p u t s ( b u f f e r ) ; / / m o s t r a r s t r i n g
f c l o s e ( a r q u i v o ) ; / / f e c h a r a r q u i v o
g e t c h a r ( ) ; }
i n t remove (c o n s t char ∗n o m e a r q u i v o )
Remove um arquivo do disco. A func¸˜ao recebe o nome do arquivo como parˆametro e retorna zero se conseguiu remover do disco ou um valor diferente de zero se n˜ao conseguiu remover o arquivo do disco.
# i n c l u d e <s t d i o . h>
i n t main ( ) {
/ / r e m o v e e v e r i f i c a s e o c o n s e g u i u
i f ( remove ( ” s a i d a . $$$ ” ) ! = 0 )
/ / a v i s a o pq n ˜ao c o n s e g u i u r e m o v e r
p e r r o r ( ” E r r o ao r e m o v e r o a r q u i v o ” ) ; e l s e
/ / a v i s a que o a r q u i v o f o i r e m o v i d o
p u t s ( ” A r q u i v o r e m o v i d o com s u c e s s o ” ) ; g e t c h a r ( ) ;
r e t u r n 0 ; }
Apresenta (mostra) a mensagem de erro interpretada pelo valor da vari´avel globalerrno em uma sequˆencia de caracteres parastderr(fluxo de sa´ıda padr˜ao de erro). Opcional-mente precede com uma mensagem do usu´ario especificada na vari´avelstring.
i n t rename (c o n s t char ∗n o m e a n t i g o , c o n s t char ∗nome novo )
Renomeia um arquivo (troca o nome do arquivo). A func¸˜ao recebe como parˆametros uma sequˆencia de caracteres referente ao nome antigo e uma sequˆencia de caracteres referente ao nome novo do arquivo. A func¸˜ao retorna zero se conseguir renomear o arquivo, caso contr´ario um valor diferente de zero.
# i n c l u d e <s t d i o . h>
i n t main ( ) { i n t r e s u l t a d o ;
char n o m e a n t i g o [ 3 2 ] = ” s a i d a . t x t ” ; char nome novo [ 3 2 ] = ” s a i d a . $$$ ” ;
/ / t e n t a r e n o m e a r o a r q u i v o e p e g a o r e s u l t a d o
r e s u l t a d o = rename ( n o m e a n t i g o , nome novo ) ;
/ / v e r i f i c a q u a l f o i o r e s u l t a d o da o p e r a c¸ ˜a o
i f ( r e s u l t a d o == 0 )
/ / renomeou o a r q u i v o c o r r e t a m e n t e
p u t s ( ” A r q u i v o r e n o m e a d o c o r r e t a m e n t e ” ) ; e l s e
/ / n ˜ao c o n s e g u i u r e n o m e a r
p e r r o r ( ” E r r o : ” ) ; g e t c h a r ( ) ;