programação i aula 27 - arquivos (cont) · programac¸˜ao i aula 27 - arquivos (cont) prof....
TRANSCRIPT
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
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
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.
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 ) ;}
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 .
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.
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 . . .
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 . . .
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 . . .
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 ) ;
}
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.
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.
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().
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.
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.
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 . . .
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 ) ;}
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 ) ;
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.
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 . . .
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 ) ;
}
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 ) ;
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.
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.
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.
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.
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 . . .
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
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
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 ) ;
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 . . .
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 ) ;}
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
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 ) ;
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.
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.
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 . . .
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
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.
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 ”,¬a ) ;p r i n t f ( ”%s \ t %.2 f \n ” , s t r , nota ) ;
}}
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
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().
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.