• Nenhum resultado encontrado

ıtulo , Autor, Assunto, Editora e Ano. 43

N/A
N/A
Protected

Academic year: 2019

Share "ıtulo , Autor, Assunto, Editora e Ano. 43"

Copied!
15
0
0

Texto

(1)

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.

(2)

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

(3)

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.

(4)

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 ) ;

(5)

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” ) ;

(6)

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

(7)

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 ) ;

(8)

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

(9)

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 ) ; }

(10)

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

(11)

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 ;

(12)

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

(13)

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.

(14)

# 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 ; }

(15)

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 ( ) ;

Imagem

Figura 4.1: Exemplo de uma ficha de descric¸˜ao de um livro.
Figura 4.2: Exemplo de um arquivo de fichas.
Tabela 4.1: Os fluxos arquivos padronizados, definidos e conectados aos v´arios dispositivos f´ısicos existentes.
Tabela 4.3: Modos de abertura dos fluxos de arquivos e seus respectivos significados.

Referências

Documentos relacionados

Com intuito, de oferecer os gestores informações precisas atualizadas e pré-formatas sobre os custos que auxiliem nas tomadas de decisões corretas, nos diversos

Atualmente os currículos em ensino de ciências sinalizam que os conteúdos difundidos em sala de aula devem proporcionar ao educando o desenvolvimento de competências e habilidades

O objetivo deste estudo foi avaliar o comporta- mento clínico de lesões de dermatite digital bovina após tratamento cirúrgico, uso local e parenteral de oxitetraci- clina e passagem

Contudo, não é possível imaginar que essas formas de pensar e agir, tanto a orientada à Sustentabilidade quanto a tradicional cartesiana, se fomentariam nos indivíduos

Local de realização da avaliação: Centro de Aperfeiçoamento dos Profissionais da Educação - EAPE , endereço : SGAS 907 - Brasília/DF. Estamos à disposição

No sentido de reverter tal situação, a realização deste trabalho elaborado na disciplina de Prática enquanto Componente Curricular V (PeCC V), buscou proporcionar as

Os instrumentos de pesquisa utilizados serão: Ficha de Rastreamento das Participantes do Estudo, International Consultation on Incontinence Questionnaire – Short Form

Users who join Reddit earlier post more and longer comments than those who join later, while users who survive longer start out both more active and more likely to comment than