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

Livre

0
0
15
1 year ago
Preview
Full text

  Cap´ıtulo 4 Fluxos de arquivos trabalho com arquivos ´e fundamental na programac¸˜ao de computadores. Por interm´edio dos

O

  

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 e etc.

  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, Editora e Ano.

  

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, Editora e Ano. Quando todas as fichas (registros) dos livros estiverem juntas em um mesmo local (um ar-

quivo de ac¸o) formando o arquivo 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.

  

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, Editora e Ano). 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

campos dos registros dos livros.

  

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

  1

buffer , 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.

  2 As func¸˜oes de entrada e sa´ıda trabalham sobre fluxos arquivos . 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 de bytes 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.

  1 Regi˜ao de mem´oria tempor´aria utilizada para escrita e leitura de dados

  2

  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

  3 controle de arquivo j´a definida na biblioteca padr˜ao stdio.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 ; t o k e n ; s h o r t

  } FILE ;

  4 O sinalizador de estatus do fluxo de arquivo 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 tipo FILE, 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 estrutura FILE 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¸˜ao fopen que 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 ) ;

  3 Do inglˆes File Control Structure for Streams.

  4 Do inglˆes File Status Flag of Streams.

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¸˜ao fopen recebe 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” ) ;

  

Onde a func¸˜ao fopen recebe como parˆametros o nome do fluxo de arquivo a ser aberto no

diret´orio corrente e o modo (cria um fluxo de arquivo para escrita). A func¸˜ao fopen re-

  Esse valor retornado para a vari´avel arquivo nunca 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 e etc a func¸˜ao fopen retornar´a NULL (nulo, zero).

  

Verificar se o fluxo de arquivo foi aberto : devido ao retorno da func¸˜ao fopen, 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:

  ( ! a r q u i v o ) i f { 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 fopen j´a no comando de selec¸˜ao if, 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 de bytes). Para ler e ou escrever tem-se as seguintes func¸˜oes da biblioteca padr˜ao: fscanf, fprintf , fread, fwrite, fgets, fputs, fgetc e fputc.

  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 tipo FILE e o formato (segue o padr˜ao a func¸˜ao scanf). 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 ;

  } f p r i n t f ( FILE i n t ∗ 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 FILE e 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

chamado meu-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 p r i n t f ( a r q u i v o , ”Nome %i [% s ]

  \ n ” , n , 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

o final do arquivo tenha sido alcanc¸ado, o que vier primeiro. Retorna o enderec¸o do 1

byte da vari´avel string

  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´avel string at´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 fgets que lˆe uma linha inteira e escreve o conte´udo da linha no fluxo de sa´ıda

no arquivo saida.txt por interm´edio da func¸˜ao fputs que escreve a linha lida com a

func¸˜ao fgets. 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 feof que 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 tipo FILE 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 i f ( ! ( s a i d a = f o p e n ( ” s a i d a . 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 ) ; } 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 ) ;

  } / / 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 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

bytes escrito no fluxo de arquivo ´e tamanho

  ×quantidade. A func¸˜ao retorna o n´umero de bytes escrito 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 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 ” , ”w” ) ) ) { 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 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 bytes lido no

fluxo de arquivo ´e tamanho ×quantidade. A func¸˜ao retorna o n´umero de bytes 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¸˜ao fclose

que recebe como parˆametro o enderec¸o para um fluxo de arquivo associado e retorna 0 se 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

  5 (elemento) curp posic¸˜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, rename e remove.

  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¸˜ao fseek recebe como parˆametros o enderec¸o de um tipo FILE, 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 ) ; ( ! a ) i f { 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 bytes do inicio do arquivo, mas

o valor retornado pode at´e ser utilizado para restaurar o indicador de posic¸˜ao usando a

func¸˜ao fseek. A func¸˜ao ftell recebe 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¸˜ao rewind permite 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 global errno

em uma sequˆencia de caracteres para stderr (fluxo de sa´ıda padr˜ao de erro). Opcional-

mente precede com uma mensagem do usu´ario especificada na vari´avel string.

  i n t r e n am e ( 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 ( ) ; r e t u r n 0 ;

  }

Novo documento

Tags

Documento similar

Casa de Oswaldo Cruz – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde FERNANDA REBELO
0
0
325
Casa de Oswaldo Cruz - FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
1
309
CASA DE OSWALDO CRUZ – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
1
1
243
Casa de Oswaldo Cruz - FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
1
168
Casa de Oswaldo Cruz – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde JOÃO LUIZ GARCIA GUIMARÃES
0
1
180
Casa de Oswaldo Cruz-FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
0
124
O Sertão nos Trilhos: ferrovia, ambiente e saúde no debate sobre a integração do Norte de Minas Gerais (Diamantina, 1902 -1922)
0
1
176
Casa de Oswaldo Cruz – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
0
169
O que é Filosofia e por que vale a pena estudá-la
0
0
16
Critérios de decisão entre hipóteses científicas rivais em Kuhn, Lakatos e Laudan
0
0
14
Projeto Interdisciplinar da Festa de Aniversário da Escola Estadual Cidade de Hiroshima HIROSHIMA – 70 anos da Bomba Ressonâncias e Repercussões
0
1
9
Transdisciplinaridade, interdisciplinaridade e disciplinaridade na história da ciência
0
0
15
A composição e estrutura dos cabelos
0
0
10
O Ensino de Equilíbrio Químico a partir dos trabalhos do cientista alemão Fritz Haber na síntese da amônia e no programa de armas químicas durante a Primeira Guerra Mundial
0
0
11
As funções malloc e free
0
0
5
Show more