programação i aula 27 - arquivos (cont) · programac¸˜ao i aula 27 - arquivos (cont) prof....

43
Programa¸ ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ ao 2 o Per´ ıodo CEFET/RJ - Centro Federal de Educa¸ ao Tecnol´ogica Celso Suckow da Fonseca UnED Petr´ opolis 2 o semestre - 2015

Upload: lekhue

Post on 14-Dec-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

Programacao IAula 27 - Arquivos (cont)

Prof. Laura Silva de Assis

Engenharia da Computacao2o Perıodo

CEFET/RJ - Centro Federal de Educacao Tecnologica Celso Suckow da Fonseca

UnED Petropolis

2o semestre - 2015

Page 2: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

1

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

Sumario

1 Arquivos

2 Processamento de arquivos binarios

3 Acesso sequencial X direto

4 Redirecionando streams

5 Referencias

Page 3: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

2

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao remove()

A funcao remove() apaga o arquivo especificado;

Prototipo:

i n t remove ( cons t char ∗f p ) ;

A funcao remove() devolve zero caso tenha sucesso, e um valor diferentede zero se nao conseguir realizar a remocao.

Page 4: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

3

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao remove()

// Apagando um arqu i vo

#i n c l u d e <s t d i o . h>#in c l u d e < s t d l i b . h>

i n t main ( i n t argc , char ∗argv [ ] ) {FILE ∗ a rqu i vo ;char opcao [ 5 ] ;

i f ( a r g c != 2){p r i n t f ( ”Erro ! ! ! \n ”) ;p r i n t f ( ”S i n t axe c o r r e t a : apagar ARQUIVO\n ”) ;e x i t ( 1 ) ;

}

p r i n t f ( ”Dese ja r e a lmen t e apagar o a rqu i vo %s (S/N) ? ” , argv [ 1 ] ) ;g e t s ( opcao ) ;

i f ( t ouppe r(∗opcao ) == ’S ’ )i f ( remove ( argv [ 1 ] ) ) {

p r i n t f ( ”Erro ao t e n t a r apagar a rqu i vo .\ n ”) ;e x i t ( 1 ) ;

}e l s e

p r i n t f ( ”Arqu i vo apagado com suc e s s o .\ n ”) ;

r e t u rn (0 ) ;}

Page 5: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

4

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao remove()

Resultado execucao

/∗ Quando o parametro passado e o nomede um arqu i vo que n ao e x i s t e∗/

Dese ja r e a lmen t e apagar o a rqu i vo t e x t e . t x t (S/N) ?SErro ao t e n t a r apagar a rqu i vo .

//Par ametro c o r r e t o

Dese ja r e a lmen t e apagar o a rqu i vo t e s t e . t x t (S/N) ?SArqu ivo apagado com suc e s s o .

Page 6: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

5

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao ferror()

A funcao ferror() determina se uma operacao com um arquivo produziuum erro;

Prototipo:

i n t f e r r o r ( FILE ∗FP) ;

A funcao ferror() retorna um valor diferente de zero (verdadeiro) seocorreu um erro durante a ultima operacao do arquivo, caso contrarioretorna zero (falso);

Como toda operacao modifica a condicao de erro, ferror() deve serchamada imediatamente apos cada operacao com arquivo, se nao um erropode ser perdido.

Page 7: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

6

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao ferror()

Exemplo: Programa que substitui espaco por tabulacoes em um arquivo texto efornece verificacao de erros.

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

#de f i n e TAB SIZE 8#d e f i n e IN 0#d e f i n e OUT 1

vo i d e r r ( i n t e ) {i f ( e == IN )

p r i n t f ( ”Erro na en t r ada . \n ”) ;e l s e

p r i n t f ( ”Erro na sa ı da\n ”) ;e x i t ( 1 ) ;

}

vo i d main ( i n t argc , char ∗argv [ ] ) {FILE ∗ i n , ∗out ;i n t tab , i ;char c ;

// c on t i n ua . . .

Page 8: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

7

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao ferror()

Exemplo: Programa que substitui espaco por tabulacoes em um arquivo texto efornece verificacao de erros.

// con t i n uac ao . . .

i f ( a r g c != 3) {p r i n t f ( ”S i n t axe de execu c ao : e xe c u t a v e l arqEntrada a rqSa i d a\n ”) ;e x i t ( 1 ) ;}

i n = fopen ( argv [ 1 ] , ”rb ”) ;i f ( i n == NULL) {p r i n t f ( ”O a rqu i vo %s n ao pode s e r ab e r t o \n ” , argv [ 1 ] ) ;e x i t ( 1 ) ;}

out = fopen ( argv [ 2 ] , ”wb”) ;i f ( out == NULL) {p r i n t f ( ”O a rqu i vo %s n ao pode s e r ab e r t o \n ” , argv [ 2 ] ) ;e x i t ( 1 ) ;}tab=0;

// c on t i n ua . . .

Page 9: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

8

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao ferror()

Exemplo: Programa que substitui espaco por tabulacoes em um arquivo texto efornece verificacao de erros.

// con t i n uac ao . . .

do{c = ge t c ( i n ) ;i f ( f e r r o r ( i n ) )

e r r ( IN ) ;

//Se en c on t r ou um tab , e n v i a num c o r r e t o de espa c osi f ( c == ’ \ t ’ ){

f o r ( i=tab ; i <8; i++){putc ( ’ ’ , out ) ;i f ( f e r r o r ( out ) )

e r r (OUT) ;}tab=0;

}

// con t i n ua . . .

Page 10: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

9

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao ferror()

Exemplo: Programa que substitui espaco por tabulacoes em um arquivo texto efornece verificacao de erros.

// con t i n uac ao . . .

e l s e {putc ( c , out ) ;i f ( f e r r o r ( out ) )

e r r (OUT) ;tab++;i f ( tab == TAB SIZE)

tab=0;i f ( c==’ \n ’ | | c==’ \ r ’ )

tab=0;}

}wh i l e ( ! f e o f ( i n ) ) ;f c l o s e ( i n ) ;f c l o s e ( out ) ;

}

Page 11: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

10

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

As funcoes remove(), ferror() e fflush()

A funcao fflush()

Esvaziando uma stream

A funcao fflush() e utilizada para esvaziar o conteudo de uma stream desaıda;

Prototipo:

i n t f f l u s h ( FILE ∗FP) ;

Essa funcao escreve o conteudo de qualquer dado existente no buffer parao arquivo associado a fp;

Se fflush() for chamada com um valor nulo, todos os arquivos abertospara saıda serao descarregados;

A funcao fflush() devolve zero para indicar sucesso e EOF para o insucesso.

Page 12: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

11

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

Processamento de arquivos binarios

Embora diz-se que os arquivos de texto nao sao formatados internamente,na verdade existe um formato indentificado por ′ \ n′ separando oscaracteres do arquivo por linhas;

Arquivos binarios, sao em geral, arquivos de dados, executaveis, jogos,etc;

Devido a diferenca nos dados armazenados em arquivos binarios e detexto, as funcionalidades exigidas para o tratamento de ambos saodiferentes;

As operacoes para processar arquivos binarios sao denominadas de acessodireto e so podem ser usadas para arquivos abertos em modo binario.

Page 13: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

12

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

Processamento de arquivos binarios

O acesso direto esta relacionado ao processamento dos dados, estespodem ser escritos e lidos em blocos de memoria para o disco;

Assim, e possıvel escrever/ler um vetor inteiro em disco de uma vez so,enquanto que tradicionalmente tem-se que escrever/ler elemento aelemento;

As funcoes de leitura e escrita que permitem acesso direto sao fread() efwrite().

Page 14: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

13

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

Processamento de arquivos binarios

O acesso direto esta relacionado ao processamento dos dados, ests podemser escritos e lidos em blocos de memoria para o disco;

Assim, e possıvel escrever/ler um vetor inteiro em disco de uma vez so,enquanto que tradicionalmente tem-se que escrever/ler elemento aelemento;

As funcoes de leitura e escrita que permitem acesso direto sao fread() efwrite();

Quando um arquivo for aberto no modo binario as funcoes fread() efwrite() podem ler e escrever qualquer tipo de informacao.

Page 15: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

14

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fwrite()

A funcao fwrite() e responsavel por escrever um bloco de bytes existentesem memoria para um arquivo aberto em modo binario;

i n t f w r i t e ( cons t vo i d ∗ptr , i n t s i z e , i n t n , FILE ∗f p ) ;

ptr: Pode ser um ponteiro para qualquer tipo de dado, ele deve conter oendereco de memoria do dado que deseja-se armazenar no arquivo;

size: Indica o tamanho em bytes de cada um dos elementos quepretende-se escrever;

n: Indica o numero de elementos que sera escrito;

fp: Ponteiro para o arquivo onde os dados serao armazenados.

Page 16: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

15

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fwrite()

A funcao fwrite() retorna o numero de itens que conseguiu escrever comsucesso;

Exemplo: Programa que le 10 inteiros a partir do teclado e armazena emdados.dat

#in c l u d e <s t d i o . h>#in c l u d e < s t d l i b . h>

vo i d main ( ) {FILE ∗f p ;i n t i , v [ 1 0 ] ;

// l e os dados a p a r t i r do t e c l a d of o r ( i =0; i <10; i++){

p r i n t f ( ” I n s i r a o %d−e simo numero : \n ” , i +1) ;s c an f ( ”%d ” , &v [ 1 ] ) ;

}

// con t i n ua . . .

Page 17: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

16

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fwrite()

Exemplo: Programa que le 10 inteiros a partir do teclado e armazena emdados.dat

// con t i n uac ao . . .

// abre o a rqu i vo dados . datfp = fopen ( ”dados . dat ” , ”wb”) ;i f ( fp == NULL) {

p r i n t f ( ”Imposs ı v e l c r i a r o a rqu i vo %s \n ” , ”dados . dat ”) ;e x i t ( 1 ) ;

}

i f ( f w r i t e ( v , s i z e o f ( i n t ) , 10 , fp ) != 10)f p r i n t f ( s t d e r r , ”Nao foram e s c r i t o s todos os e l emen to s ! ! ! \ n ”) ;

f c l o s e ( fp ) ;}

Page 18: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

17

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fwrite()

f w r i t e ( v , s i z e o f ( i n t ) , 10 , fp ) ;

Como o dado a ser escrito e um vetor, e todos os elementos ocupamposicao contıgua de memoria, o endereco do primeiro elemento e &v[0] ouv;

A instrucao de escrita no arquivo poderia ser substituida por:

// i n s e r e um e lemento de cada vezf o r ( i =0; i <10; i++)f w r i t e ( v+i , s i z e o f ( i n t ) , 1 , fp ) ;

f w r i t e ( v , 1 , s i z e o f ( i n t )∗10 , fp ) ;

Page 19: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

18

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fread()

A funcao fread() e responsavel pela leitura para memoria de um bloco debytes existentes em um arquivo aberto em modo binario;

// s i n t a x ei n t f r e a d ( cons t vo i d ∗ptr , i n t s i z e , i n t n , FILE ∗f p ) ;

ptr: E um ponteiro para qualquer tipo de dado, e deve conter o enderecode memoria onde deseja-se armazenar os dados lidos do arquivo;

size: Indica o tamanho em bytes de cada um dos elementos quepretende-se ler;

n: Indica o numero de elementos que sera lido;

fp: Ponteiro para o arquivo de onde os dados serao lidos.

Page 20: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

19

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fread()

A funcao fread() retorna o numero de itens que conseguiu ler comsucesso;

Exemplo: Programa que le 10 inteiros a partir do arquivo dados.dat emostra-os na tela.

#in c l u d e <s t d i o . h>#in c l u d e < s t d l i b . h>

vo i d main ( ) {FILE ∗f p ;i n t i , v [ 1 0 ] , n ;

// abre o a rq au i vo dados . datfp = fopen ( ”dados . dat ” , ”rb ”) ;i f ( fp == NULL) {

p r i n t f ( ”Imposs ı v e l l e r o a rqu i vo dados . dat\n ”) ;e x i t ( 1 ) ;

}

// con t i n ua . . .

Page 21: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

20

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fread()

Exemplo: Programa que le 10 inteiros a partir do arquivo dados.dat emostra-os na tela.

// con t i n uac ao . . .

n = f r e a d ( v , s i z e o f ( i n t ) , 10 , fp ) ;i f (n != 10)

f p r i n t f ( s t d e r r , ”Foram l i d o s apenas %d e l emen to s\n ” , n ) ;

//most ra os dados l i d o s ao usu a r i oi f (n > 0){

f o r ( i =0; i< n ; i++)p r i n t f ( ”%2do No : %d\n ” , i +1, v [ i ] ) ;

}f c l o s e ( fp ) ;

}

Page 22: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

21

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

A funcao fread()

f r e a d ( v , s i z e o f ( i n t ) , 10 , fp ) ;

Como o dado a ser lido e um vetor, e todos os elementos ocupam posicaocontıgua de memoria, o endereco do primeiro elemento e &v[0] ou v;

A instrucao de escrita no arquivo poderia ser substituida por:

// i n s e r e um e lemento de cada vezf o r ( i =0; i <10; i++)f r e a d ( v+i , s i z e o f ( i n t ) , 1 , fp ) ;

f r e a d (v , 1 , s i z e o f ( i n t )∗10 , fp ) ;

Page 23: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

22

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoAs funcoes fread() e fwrite()

fwrite() e fread()

Nota

Uma das aplicacoes mais uteis das funcoes fread() e fwrite() envolve ler eescrever tipos de dados definidos pelo usuario, especialmente estruturas,que sera visto nas proximas aulas.

Page 24: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

23

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

Acesso sequencial X acesso direto a arquivos

O acesso a informacao pode ser realizado de duas formas:

Sequencial: Percorre o arquivo ate localizar o dado desejado;

Direto: Coloca-se em uma certa posicao do arquivo e procura o dadoa partir daquela posicao (nao percorre todos os bytes do arquivo);

Exemplo: Acesso a um determinado nome na lista telefonica.

Page 25: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

24

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

Posicionamento ao longo de um arquivo

Sempre que se abre um arquivo (funcao fopen()) e criada em memoriauma estrutura do tipo FILE que contem informacoes sobre o arquivo queesta processando, uma dessas informacoes e a posicao atual em que seesta no arquivo

A informacao atual e sempre armazenada, dado que as funcoes deleitura/escrita avancam automaticamente no arquivo;

A posicao corrente de um arquivo e dada em forma de bytes dado que o Cnao enxerga o arquivo formatado;

Entao, sempre que um arquivo e aberto, (exceto com a opcao “a”) fica-seposicionado no primeiro byte do arquivo (posicao zero);

Se o arquivo for aberto com a opcao “a” entao fica-se posicionado apos oultimo byte do arquivo.

Page 26: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

25

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao ftell()

A funcao ftell() indica a posicao corrente em um arquivo;

l ong f t e l l ( FILE ∗f p ) ;

A funcao ftell() retorna um long dado que a dimensao dos arquivos podeutrapassar o valor maximo representado por um inteiro.

Page 27: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

26

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao ftell()

Exemplo: Programa que indica quantos bytes um arquivo possuiutilizando acesso sequencial;

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

vo i d main ( i n t argc , char ∗argv [ ] ) {

FILE ∗f p ;l ong i n t nBytes = 0 ;

// v e r i f i c a a quan t i d ad e de argumentosi f ( a r g c != 2){

p r i n t f ( ”S i n t axe : %s a rqu i vo \n ” , argv [ 0 ] ) ;e x i t ( 1 ) ;

}

f p = fopen ( argv [ 1 ] , ”rb ”) ;i f ( fp == NULL) {

p r i n t f ( ”Imposs ı v e l a b r i r a r qu i vo %s \n ” , argv [ 1 ] ) ;e x i t ( 1 ) ;

}// con t i n ua . . .

Page 28: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

27

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao ftell()

Exemplo: Programa que indica quantos bytes um arquivo possuiutilizando acesso sequencial;

// con t i n uac ao . . .

// ac e s s o s e qu e n c i a l byte a b y t e swh i l e ( f g e t c ( fp ) != EOF)nBytes++;

f c l o s e ( fp ) ;

p r i n t f ( ”Dimens ao do a rqu i vo : %l d \n ” , nBytes ) ;}

Resultado da execucao

. / a . e t e x t o . t x tDimens ao do a rqu i vo : 2261

Page 29: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

28

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao ftell()

Exemplo: Programa que indica quantos bytes um arquivo possuiutilizando acesso sequencial;

//o mesmo r e s u l t a d o do programa a n t e r i o r p od e r i a s e r ob t i d o usando a fun c ao f t e l l ( )

. . .

// ac e s s o s e qu e n c i a l byte a b y t e swh i l e ( f g e t c ( fp ) != EOF) ;

p r i n t f ( ”Dimens ao do a rqu i vo : %l d \n ” , f t e l l ( f p ) ) ;

f c l o s e ( fp ) ;}

Resultado da execucao

. / a . e t e x t o . t x tDimens ao do a rqu i vo : 2261

Page 30: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

29

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao rewind()

Independente do posicionamento do ponteiro no arquivo, e semprepossıvel colocar o ponteiro a apontar para o inıcio do arquivo;

A funcao rewind() reposiciona o indicador de posicao de arquivo no inıciodo mesmo, ou seja, essa funcao rebobina o arquivo;

A funcao rewind() evita ter que fechar o arquivo e voltar a abrı-lo, parasimplesmente posicionar o ponteiro no comeco do arquivo.

Prototipo da funcao rewind():

vo i d rewind ( FILE ∗f p ) ;

Page 31: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

30

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao rewind()

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>#i n c l u d e <s t r i n g . h>

vo i d main ( ) {char s t r [ 8 0 ] ;FILE ∗f p ;

fp = fopen ( ” t e s t e . t x t ” , ”w+”) ;i f ( fp == NULL) {

p r i n t f ( ”Imposs ı v e l a b r i r a r qu i vo \n ”) ;e x i t ( 1 ) ;

}

p r i n t f ( ”\ nD i g i t e uma s t r i n g e @ pra s a i r \n ”) ;g e t s ( s t r ) ;wh i l e (∗ s t r != ’@ ’ ){

s t r c a t ( s t r , ”\n ”) ;f p u t s ( s t r , f p ) ;p r i n t f ( ”\ nD i g i t e uma s t r i n g e @ pra s a i r \n ”) ;g e t s ( s t r ) ;

}// con t i n ua . . .

Page 32: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

31

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao rewind()

Resultado execucao

// con t i n uac ao . . .

// l e e most ra o a rqu i vorewind ( fp ) ;p r i n t f ( ”\n\n ”) ;f g e t s ( s t r , 79 , fp ) ;wh i l e ( ! f e o f ( fp ) ) {

p r i n t f ( ”%s ” , s t r ) ;f g e t s ( s t r , 79 , fp ) ;

}

f c l o s e ( fp ) ;}

Page 33: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

32

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao rewind()

Resultado execucao

D i g i t e uma s t r i n g e @ pra s a i rAula de C

D i g i t e uma s t r i n g e @ pra s a i rCEFET − RJ

D i g i t e uma s t r i n g e @ pra s a i rProgramac ao I

D i g i t e uma s t r i n g e @ pra s a i r@

Aula de CCEFET − RJProgramac ao I

Page 34: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

33

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao fseek()

E possıvel realizar operacoes de leitura/escrita de forma aleatoria;

fseek() e a funcao mais importante de posicionamento em arquivos, poispermite apontar o ponteiro para qualquer posicao de um arquivo;

Prototipo da funcao fseek():

i n t f s e e k ( FILE ∗fp , l ong numBytes , i n t or i gem ) ;

Page 35: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

34

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao fseek()

i n t f s e e k ( FILE ∗fp , l ong numBytes , i n t or i gem ) ;

fp: e o ponteiro para o arquivo;

numBytes: e o numero de bytes a partir da origem o ponteiro ira sedeslocar no arquivo. Um valor positivo indica que o ponteiro se deslocarapara frente, um valor negativo ele se deslocara para tras;

origem: Indica o local a partir do qual deseja realizar o deslocamento noarquivo.

Page 36: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

35

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao fseek()

i n t f s e e k ( FILE ∗fp , l ong numBytes , i n t or i gem ) ;

Para a origem: sao adimitidos apenas 3 valores (constantes):

SEEK SET o deslocamento e realizado a partir da origem (valor ==0);

SEEK CUR o deslocamento e realizado a partir da posicao corrente(valor == 1);

SEEK END o deslocamento e realizado a partir do final do arquivo(valor == 2).

fseek() devolve zero se o movimento dentro do arquivo foi realizado comsucesso, no caso de insucesso devolve um valor diferente de zero.

Page 37: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

36

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao fseek()

Exemplo: Programa que indica quantos bytes um arquivo possuiutilizando acesso direto;

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

vo i d main ( i n t argc , char ∗argv [ ] ) {

FILE ∗f p ;l ong i n t nBytes = 0 ;

// v e r i f i c a a quan t i d ad e de argumentosi f ( a r g c != 2){

p r i n t f ( ”S i n t axe : %s a rqu i vo \n ” , argv [ 0 ] ) ;e x i t ( 1 ) ;

}

f p = fopen ( argv [ 1 ] , ”rb ”) ;i f ( fp == NULL) {

p r i n t f ( ”Imposs ı v e l a b r i r a r qu i vo %s \n ” , argv [ 1 ] ) ;e x i t ( 1 ) ;

}// con t i n ua . . .

Page 38: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

37

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

IntroducaoPosicionamento ao longo de um arquivo

A funcao fseek()

Exemplo: Programa que indica quantos bytes um arquivo possuiutilizando acesso direto;

// con t i n uac ao . . .

// i r para o f i n a l do a rqu i vof s e e k ( fp , 0L , SEEK END) ;// f s e e k ( fp , 0L , 2) ;

p r i n t f ( ”Dimens ao do a rqu i vo : %l d \n ” , f t e l l ( f p ) ) ;

f c l o s e ( fp ) ;}

Resultado da execucao

. / a . e t e x t o . t x tDimens ao do a rqu i vo : 2261

Page 39: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

38

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

Funcao freopen()

A funcao freopen()

A funcao freopen() redirecionar streams padrao, associando a streamexistente a um novo arquivo;

Prototipo:

FILE ∗ f r e op en ( cons t char ∗nomeArq , cons t char ∗modo , FILE ∗FP) ;

nomeArq e um ponteiro para o nome do arquivo que se deseja associar astream apontada por fp;

modo e o tipo de abertura do arquivo, que pode assumir os mesmosvalores usados em fopen();

O ponteiro para o arquivo fp e retornado em caso de sucesso e freopen()retorna NULL em caso de falha.

Page 40: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

39

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

Funcao freopen()

A funcao freopen()

Exemplo: Programa que usa freopen() para redirecionar a stream de saıdapadrao para um arquivo

#i n c l u d e <s t d i o . h>

vo i d main ( ) {char s t r [ 8 0 ] ;i n t numA , i ;f l o a t nota ;

p r i n t f ( ”D i g i t e : \n 1 . A d i s c i p l i n a \n 2 . Quant idade de a l uno s \n 3 . Nomes e no t a s\n ”) ;f r e op en ( ”s a i d a . t x t ” , ”w” , s t dou t ) ;g e t s ( s t r ) ;p r i n t f ( ”∗∗∗ D i s c i p l i n a : %s ∗∗∗\n\n ” , s t r ) ;s c an f ( ”%d ”,&numA) ;f o r ( i =0; i<numA ; i++){

ge t c ha r ( ) ;s c an f ( ”%s ” , s t r ) ;s c an f ( ”%f ”,&nota ) ;p r i n t f ( ”%s \ t %.2 f \n ” , s t r , nota ) ;

}}

Page 41: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

40

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

Funcao freopen()

A funcao freopen()

Exemplo: Execucao

D i g i t e :1 . A d i s c i p l i n a2 . Quant idade de a l uno s3 . Nomes e no t a s

Programac ao I5Andre5 .6pedro 7 .5Lara3 .5Tiago8 .4Ze9 . 5

Page 42: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

41

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

Funcao freopen()

A funcao freopen()

Nota 1

Em geral usar freopen() e util em situacoes especiais como depuracao.

Nota 2

Efetuar operacoes de E/S em disco usando stdin e stdout redirecionados nao etao eficiente quanto usar fread() e fwrite().

Page 43: Programação I Aula 27 - Arquivos (cont) · Programac¸˜ao I Aula 27 - Arquivos (cont) Prof. Laura Silva de Assis Engenharia da Computa¸c˜ao 2o Per´ıodo CEFET/RJ - Centro Federal

42

ArquivosProcessamento de arquivos binarios

Acesso sequencial X diretoRedirecionando streams

Referencias

Referencias

1 C Completo e Total, Herbert Schidt; Pearson Makron Books; 3a.Ed., 1997.

2 Linguagem C, Luıs Damas, LTC, 10a. Ed.2014.