You are on page 1of 14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Programar em C++/Entrada e sada de dados 2


Origem: Wikilivros, livros abertos por um mundo aberto. < Programar em C++

ndice
1 Entrada/Sada em ficheiros (arquivos) 2 Gravar (Salvar) os dados para um ficheiro(arquivo) 3 O que um ficheiro(arquivo)? 4 Ficheiros(Arquivos) binrios e tipo texto 5 biblioteca padro fstream 6 Abrir um ficheiro(arquivo) 7 Usando o Construtor 8 Usando a funo membro "open" 9 Comparando os dois mtodos (pela funo membro e pelo construtor) 10 Abrir um arquivo para leitura 11 Verificar se o ficheiro (arquivo) foi aberto. 12 Fechar um ficheiro (arquivo) 13 Looping pelo ficheiro (arquivo). 14 Manipuladores 14.1 Ajustando a largura da entrada/sada 14.2 Preenchimento de espaos em branco 14.3 Ajustando a preciso 15 Exerccios

Entrada/Sada em ficheiros (arquivos)


Nota introdutria: Este capitulo geralmente colocado uns captulos mais para o fim, mas acho por bem que se torne as coisas mais interativas, o que possvel introduzindo agora operaes em arquivos, d muito mais entusiasmo. Encontramos aqui conceitos avanados mas podero ser deixados para depois se o leitor no quiser observar o tema neste momento.

Gravar (Salvar) os dados para um ficheiro(arquivo)


Os dados que mantemos nos programas esto guardados na memria RAM, que limpa quando o programa ou computador para de funcionar. Isso implicaria que perderamos toda a informao! Porm existe uma maneira para tornar os dados persistentes que gravar os dados num ficheiro (arquivo) no "hard drive" (disco rgido) ou no outro meio persistente. Nas formas mais diretas de escrita podemos passar os dados em formato binrio para o ficheiro(arquivo). Outros meios avanados para guardar dados podem envolver bases de dados relacionais ou XML.

O que um ficheiro(arquivo)?
http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 1/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Um arquivo uma coleo de dados que esto localizados numa memria persistente tipo hard drive, cd-rom, etc. Para identificarmos o arquivo podemos atribuir-lhe um nome (filename). Os "filenames" tm usualmente uma extenso, que determina o tipo de arquivo em sistemas operacionais semelhantes aos da Microsoft, mas que podem ser dispensados em sistemas operacionais que guardam as caractersticas dos arquivos no meio de armazenamento, tais quais sistemas UNIX e seus similares GNU/Linux, FreeBSD, etc... A extenso representada por 3 ou 4 letras que seguem aps o nome do arquivo e um ponto ".". Por exemplo: "joao.doc" ou "joao.odt". Isto diz-me que temos um ficheiro(arquivo) que se chama "joao", e que tem a extenso .doc que refere usualmente a documentos do WORD no primeiro caso e com extenso ".odt" do OpenOffice no segundo. Outros tipos de extenses podem ser ".xls" para documentos EXCEL, ".ods" para planilhas do OpenOffice. ou ainda ".cpp" para ficheiros(arquivos) de cdigos de c++.

Ficheiros(Arquivos) binrios e tipo texto


Existem na verdade dois tipos de ficheiros(arquivos): os do tipo texto e os do tipo binrio. Os arquivos tipo texto apenas armazenam texto obedecendo uma codificao de caracteres, a mais comum a ASCII, isto implica no uso do cdigo para armazenamento, ou seja, pode ser que a codificao seja interpretada antes de ser efetivada no meio de armazenamento. Os arquivos binrios podem guardar mais informao, como imagens, base de dados, programasPor exemplo, editores de texto com formatao, como o OpenOffice e o Word, guardam os seus arquivos em formatos binrios, porque eles possuem alm do texto, informao acerca da formatao do texto, para as tabelas, as listas numeradas, tipo de fonte, etc... da aparecerem os caracteres de formatao tipo 6, L, h5 Os arquivos binrios podero ser mais bem explorados em um tpico avanado, vamos trabalhar inicialmente com arquivos tipo texto, que poderemos operar de maneira mais simplificada.

biblioteca padro fstream


At agora temos usado a biblioteca iostream (i de input + o de output + stream), que suporta, entre vrias funcionalidades, o objeto cin para ler da "standard input" (que usualmente o teclado) e o objeto cout para "standard output" (que usualmente o monitor) Ora, agora queremos ler e escrever para ficheiros(arquivos) e isso requer a biblioteca fstream (f de file + stream). Esta biblioteca define 3 novos tipos de classe: ofstream (apenas para sada "out to a file". serve para criar, manipular ficheiros (arquivos) e escrever, no serve para ler). ifstream (apenas para entrada "in from a file" . serve para ler ficheiros (arquivos), receber dados dos mesmos, no serve para criar nem escrever). fstream (este conjuga os dois tipos anteriores, "input and output to file". cria ficheiros (arquivos), escreve e l informao dos mesmos.

Abrir um ficheiro(arquivo)
Um ficheiro(arquivo) deve ser aberto pelo programa para que o mesmo possa ser manipulado, a abertura do arquivo implica, entre outras coisas, em atribuir um identificador que nos permita ter acesso aos seus dados. necessrio criar uma linha de comunicao entre o arquivo e o objeto stream.
http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 2/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Podemos recorrer a dois mtodos para abrir um ficheiro (arquivo): 1. Usando um construtor; 2. Usando a funo membro chamada de "open".

Usando o Construtor
O construtor uma funo que automaticamente chamada quando tentamos criar uma instncia de um objeto.

f s t r e a ma f i l e ;

/ / c r i a d ou m ai n s t n c i ad of s t r e a mc h a m a d ad ea f i l e

Os construtores de objetos podem ser sobrecarregados, ou seja, para a mesma classe podemos ter um construtor sem argumentos, com um argumento, dois argumentos, etc. No exemplo anterior criamos um sem argumentos. Os construtores no retornam valores, geralmente o compilador reporta erro quando se declara funes que retornam valor e estas tm o mesmo nome da classe, pois este nome reservado para os construtores. Vamos dar um exemplo com dois argumento:

o f s t r e a mo u t f i l e( " j o a o . d o c " ,i o s : : o u t ) ;

Chama o construtor com dois argumentos, criando uma instncia de ofstream e abrindo o ficheiro(arquivo) "joao.doc" para operaes de sada.

Usando a funo membro "open"


Esta funo tem como primeiro argumento o nome e localizao do ficheiro/(arquivo) a ser aberto, o segundo argumento especifica o modo de abertura. Sobre a questo da localizao existem 2 tipos, o "path" relativo e o "path" absoluto. Para este ltimo indicamos o caminho todo: "c:\\....\\joao.doc" em sistemas Microsoft ou "/home/joao/joao.odt" para sistemas UNIX e similares. O "path" relativo dispensa essa descrio se o ficheiro/(arquivo) estiver (na mesma directoria)/(no mesmo diretrio) que o programa. Sobre a questo do modo de abertura temos as seguintes modalidades:

http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2

3/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Modo do sinalizador abertura (Flag) ios::app ios::ate ios::binary ios::in ios::out ios::trunc "Binary mode" "Input mode" "Output mode" "Append mode"

Descrio Todos os dados do arquivo so preservados e qualquer sada escrita a partir do fim do arquivo. Se o arquivo j existe,o programa vai diretamente ao seu fim.O modo de escrita ento feito de forma aleatria.Usado normalmente com arquivos do modo binrio(binary mode). Informaes so escritas na forma binria e no na forma textual(text mode). Leitura de informaes de arquivo(no ir criar um arquivo novo) Informaes sero escritas no arquivo. Se o arquivo j existe,suas informaes sero truncadas, outra forma de se dizer: deletadas e reescritas.

Os sinalizadores (flags) so nmeros em potncias da base binria, portanto podemos ter vrios flags ao mesmo tempo se usarmos o operador unrio para a operao "OU", como no exemplo abaixo:

o f s t r e a mo u t f i l e ; / / c r i ooo b j e t oo u t f i l e o u t f i l e . o p e n ( " s t u d e n t s . d a t " ,i o s : : b i n a r y|i o s : : a p p ) ;/ * c h a m oaf u n om e m b r oo p e nd oo b j e t o , c o mo1 p a r m e t r oq u eon o m ed oa r q u i v o eo2 om o d od ea b e r t u r a .* /

Observe que estamos abrindo o arquivo "students.dat" em modo binrio e ao mesmo tempo com o modo "append", isto significa que abriremos o arquivo e poderemos preservar o seu contedo anterior inserindo os novos dados no fim do arquivo.

Comparando os dois mtodos (pela funo membro e pelo construtor)


O primeiro mtodo similar a ter

i n ta g e ; a g e = 3 9 ;

O segundo mtodo similar a

i n ta g e = 3 9 ;

http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2

4/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

A escolha do melhor mtodo em cada situao depende do contexto em que estamos criando o cdigo, geralmente quando j temos o objeto criado e ele est fechado podemos abrir um novo arquivo com ele e depois fech-lo novamente, isto nos sugere que usemos a funo open quando o objeto deve abrir arquivos diferentes em cada trecho de cdigo, embora que possam surgir outras funcionalidades, dependendo de como o projeto foi idealizado.

Abrir um arquivo para leitura


A histria aqui a mesma s tem uma diferena: que no caso de leitura, no ser criado nenhum ficheiro (arquivo) caso ele no exista.

i f s t r e a ma r q ; a r q . o p e n( j o o . d o c ) ;

/ / c r i ao b j e t o" a r q " / / c h a m af u n om e m b r oo p e na oo b j e t o" a r q " ,c o mo / / p a r m e t r od on o m ed of i c h e i r o

Poderamos fazer o mesmo com o construtor:

i f s t r e a ma r q( j o o . d o c ) ;

Ou ainda

f s t r e a mb l o c o ; b l o c o . o p e n ( " j o a o . d o c " ,i o s : : i n )

ou ainda

f s t r e a mb ( j o a o . d o c ,i o s : : i n )

H mais uma nota a fazer, se quisermos ler e escrever, no podemos usar o ofstream e o ifstream ao mesmo tempo, teremos de usar o fstream. Teremos de fazer:

f s t r e a ma( j o o . d o c ,i o s : : i n|i o s : : o u t ) ;

Neste caso, o comportamento padro preservar o contedo do ficheiro (arquivo) ou cri-lo caso ele no exista.

Verificar se o ficheiro (arquivo) foi aberto.


http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 5/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Vamos verificar o que acontece quando tentamos abrir um arquivo que no existe, a primeira verso do nosso exemplo observa o comportamento bsico do fstream:

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m > u s i n gn a m e s p a c es t d ; i n tm a i n( ) { i f s t r e a ma r q ; a r q . o p e n ( " j o a o . d o c " ) ;

/ / c r i oo b j e t o" a r q "d ac l a s s ei f s t r e a m-l e i t u r a / / c h a m of u n om e m b r oo p e n

c o u t< <" ( a r q )="< <a r q< <e n d l ; / / i m p r i m eoo b j e t o c o u t< <" ( a r q . f a i l ( ) )="< <a r q . f a i l ( )< <e n d l ; / / c h a m of u n om e m b r of a i l # i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

No caso do ficheiro (arquivo) joao.doc no existir:


( a r q )=0 0 0 0 0 0 0 0 ( a r q . f a i l ( ) )=1

No caso do ficheiro (arquivo) joao.doc existir no mesmo diretrio que o programa:


( a )=0 0 1 2 F E 4 0 ( a . f a i l ( ) )=0

Repare que o resultado a impresso do endereo, do objeto a de ifstream. d um ponteiro!! Agora, vajamos um exemplo mais completo:

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m > u s i n gn a m e s p a c es t d ; i n tm a i n( ) { i f s t r e a ma r q ; s t r i n gs t r ; a r q . o p e n ( " j o a o . d o c " ) ;

/ / c r i oo b j e t o" a r q "d ac l a s s ei f s t r e a m-l e i t u r a / / c h a m of u n om e m b r oo p e n

i f( a r q . i s _ o p e n ( )& &a r q . g o o d ( ) ) { a r q> >s t r ; c o u t< <" c o n t e d o :\ n"< <s t r< <e n d l ;/ / i m p r i m eoc o n t e d od oa r q u i v o } a r q . c l o s e ( ) ;

# i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f
http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 6/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

r e t u r n0 ;

Observe que aqui verificamos se o arquivo foi aberto com a funo membro is_open() que retorna verdadeiro "true" caso o arquivo foi aberto, depois verificamos se o arquivo foi aberto satisfatoriamente atravs da funo membro good(), que tambm retorna verdadeiro se o arquivo pode ser usado.

Fechar um ficheiro (arquivo)


Devemos fechar depois de ler e/ou escrever. Mas por que, se o objeto do ficheiro ir ser fechado assim que o programa acabar? Porque estamos a utilizar recursos com um ficheiro (arquivo) aberto, porque alguns sistemas operativos (operacionais) limitam o n de ficheiros (arquivos) abertos, e estando este aberto impede que outros se possam abrir e por fim porque se no fecharmos, outros programas no podero abri-lo at que o fechemos. Este comportamento faz parte de um esquema de controle de acesso usado pelo sistema para assegurar que os arquivos no sero usados por processos diferentes ao mesmo tempo.

o f s t r e a mo u t f i l e ; o u t f i l e . o p e n ( " s t u d e n t s . d a t " ) ; / /. . . . o u t f i l e . c l o s e ( ) ;

Vamos criar um exemplo mais real. Queremos criar um programa que escreva informao inserida pelo utilizador num ficheiro por ns escolhido

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m > u s i n gn a m e s p a c es t d ; i n tm a i n( ) { c h a rd a t a [ 8 0 ] ; o f s t r e a mo u t f i l e ; o u t f i l e . o p e n ( " j o a o . d o c " ) ;

/ / c r i a m o su ma r r a yd e8 0c a r a c t e r e s / / c r i a m o so b j e t od ac l a s s eo f s t r e a m / / c h a m a m o saf u n om e m b r od ac l a s s ep a r aoo b j e t oc r i a d o . / /E s t af u n om e m b r oc r i aoa r q u i v o" j o a o . d o c "

i f( o u t f i l e . i s _ o p e n ( )& &o u t f i l e . g o o d ( ) )/ / v e r i f i c a m o ss ee s t t u d ob e m {c o u t< <" d i g i t eos e un o m e :" ; / / i m p r i m en oe c r ( m o n i t o r )af r a s e c i n . g e t l i n e ( d a t a ,8 0 ) ; / / c h a m af u n om e m b r og e t l i n ed oo b j e t oc i np a r a / / l e roq u ef o ie s c r i t op e l ou s u r i o o u t f i l e< <d a t a< <e n d l ; o u t f i l e . c l o s e ( ) ; / / c o l o c aoa r r a yn oo b j e t oc r i a d o . / / f e c h a m o soo b j e t o .

# i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

Podemos ir ver o novo ficheiro/arquivo com o nome joao.doc e tem l escrito aquilo que digitamos. Agora vamos tentar ler o que escrevemos no documento criado.
http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 7/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m > u s i n gn a m e s p a c es t d ; i n tm a i n( ) { c h a rd a t a [ 8 0 ] ; i f s t r e a mi n f i l e ; i n f i l e . o p e n ( " j o a o . d o c " ) ; i f( i n f i l e . i s _ o p e n ( )& &i n f i l e . g o o d ( ) )/ / v e r i f i c a m o ss ee s t t u d ob e m {i n f i l e> >d a t a ; / / c o l o c a m o so sd a d o sa b e r t o sn oa r r a y c o u t< <d a t a< <e n d l ; i n f i l e . c l o s e ( ) ; } # i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f r e t u r n0 ; }

Repare que se tivssemos escrito duas palavras, apenas uma era apresentada (ela pra no primeiro whitespace), para isso necessitaramos de repetir:

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m > u s i n gn a m e s p a c es t d ; i n tm a i n( ) { c h a rd a t a [ 8 0 ] ; i f s t r e a mi n f i l e ; i n f i l e . o p e n ( " j o a o . d o c " ) ; i f( i n f i l e . i s _ o p e n ( )& &i n f i l e . g o o d ( ) )/ / v e r i f i c a m o ss ee s t t u d ob e m {i n f i l e> >d a t a ; / / c o l o c a m o so sd a d o sa b e r t o sn oa r r a y c o u t< <d a t a< <e n d l ; i n f i l e> >d a t a ; / / c o l o c a m o so sd a d o sa b e r t o sn oa r r a y c o u t< <d a t a< <e n d l ; i n f i l e . c l o s e ( ) ; } # i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

Agora j obtemos 2 palavras e so apresentadas em linhas diferentes. Mas temos de arranjar um mtodo para no estar a repetir constantemente, podemos fazer isso com

i n f i l e . g e t l i n e ( d a t a ,8 0 ) ;

Ento ficamos com:

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m >


http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 8/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

# i n c l u d e< s t r i n g > u s i n gn a m e s p a c es t d ; i n tm a i n( ) { s t r i n gd a t a ; o f s t r e a mo u t f i l e ; o u t f i l e . o p e n ( " j o a o . d o c " ) ; i f( o u t f i l e . i s _ o p e n ( )& &o u t f i l e . g o o d ( ) )/ / v e r i f i c a m o ss ee s t t u d ob e m { c o u t< <" W r i t i n gt ot h ef i l e "< <e n d l ; c o u t< <" = = = = = = = = = = = = = = = = = = = "< <e n d l ; c o u t< <" E n t e rc l a s sn a m e :" ; g e t l i n e ( c i n ,d a t a ) ; o u t f i l e< <d a t a< <e n d l ; c o u t< <" E n t e rn u m b e ro fs t u d e n t s :" ; c i n> >d a t a ; c i n . i g n o r e ( ) ; / / e s t af u n om e m b r op a r al i m p a roc a r a c t e r e / / n e w l i n ed oi n p u t b u f f e rd e p o i sd eu s a roo b j e t o / / c i nc o moo p e r a d o rd ee x t r a o> > o u t f i l e< <d a t a < <e n d l ; o u t f i l e . c l o s e ( ) ; } i f s t r e a mi n f i l e ; i n f i l e . o p e n ( " j o a o . d o c" ) ; i f( i n f i l e . i s _ o p e n ( )& &i n f i l e . g o o d ( ) )/ / v e r i f i c a m o ss ee s t t u d ob e m {c o u t< <" R e a d i n gf r o mt h ef i l e "< <e n d l ; c o u t< <" = = = = = = = = = = = = = = = = = = = = = "< <e n d l ; g e t l i n e ( i n f i l e ,d a t a ) ; c o u t< <d a t a< <e n d l ; g e t l i n e ( i n f i l e ,d a t a ) ; c o u t< <d a t a< <e n d l ; i n f i l e . c l o s e ( ) ; } # i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

Looping pelo ficheiro (arquivo).


E se no soubermos quantas linhas tem o arquivo? O objeto ifstream tem uma funo membro que a eof() (e-end+o-of+f-file). Esta funo no tem parmetros e retorna "true" se o fim do arquivo for alcanado e "false" caso contrrio. No entanto, esta funo eof() no de confiana com os ficheiros (arquivos) texto como o para os binrios ( que nos ficheiros (arquivos) binrios no existem espaos em branco). A melhor alternativa usar a funo membro fail().

i f s t r e a mi n f i l e ; i n f i l e . o p e n ( " j o a o . d o c " ) ; i f( i n f i l e . i s _ o p e n ( )& &i n f i l e . g o o d ( ) ) {i n f i l e> >d a t a ; w h i l e ( ! i n f i l e . f a i l ( ) ) {i n f i l e> >d a t a ; c o u t< <d a t a ; } } i n f i l e . c l o s e ( ) ;

http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2

9/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Refazendo tudo

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m > # i n c l u d e< s t r i n g > u s i n gn a m e s p a c es t d ; i n tm a i n( ) { s t r i n gd a t a ; o f s t r e a mo u t f i l e ; o u t f i l e . o p e n ( " j o a o . d o c " ) ; i f( o u t f i l e . i s _ o p e n ( )& &o u t f i l e . g o o d ( ) ) { c o u t< <" E s c r e v e n d on oa r q u i v o "< <e n d l ; c o u t< <" = = = = = = = = = = = = = = = = = = = "< <e n d l ; c o u t< <" I n f o r m eon o m ed ac l a s s e :" ; g e t l i n e ( c i n ,d a t a ) ; o u t f i l e< <d a t a < <e n d l ; c o u t< <" i n f o r m eon m e r od ee s t u d a n t e s :" ; c i n> >d a t a ; c i n . i g n o r e ( ) ; o u t f i l e< <d a t a < <e n d l ; o u t f i l e . c l o s e ( ) ; } i f s t r e a mi n f i l e ; i n f i l e . o p e n ( " j o a o . d o c " ) ; i f( i n f i l e . i s _ o p e n ( )& &i n f i l e . g o o d ( ) ) { c o u t< <" L e n d od oa r q u i v o "< <e n d l ; c o u t< <" = = = = = = = = = = = = = = = = = = = = = "< <e n d l ; g e t l i n e ( i n f i l e ,d a t a ) ; w h i l e ( ! i n f i l e . f a i l ( ) ) { c o u t< <d a t a< <e n d l ; g e t l i n e ( i n f i l e ,d a t a ) ; } } i n f i l e . c l o s e ( ) ;

# i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

Agora vamos fazer o nosso programa mais modular: 1. . writeFile para abrir um arquivo para escrita usando o ofstream e 2. . readFile - ler do ficheiro (arquivo) usando o ifstream 3. . Cada funo ir verificar se o ficheiro (arquivo) foi aberto com sucesso

# i n c l u d e< f s t r e a m > # i n c l u d e< i o s t r e a m > # i n c l u d e< s t r i n g > u s i n gn a m e s p a c es t d ;

http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2

10/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

b o o lw r i t e F i l e( o f s t r e a m & ,c h a r * ) ; b o o lr e a d F i l e( i f s t r e a m & ,c h a r * ) ; i n tm a i n( ) { s t r i n gd a t a ; b o o ls t a t u s ; o f s t r e a mo u t f i l e ; s t a t u s=w r i t e F i l e ( o u t f i l e ," s t u d e n t s . d a t " ) ; i f( ! s t a t u s ) { c o u t< <" A r q u i v on op o d es e ra b e r t op a r ae s c r i t a . \ n " ; c o u t< <" P r o g r a m at e r m i n a n d o . . . \ n " ; r e t u r n0 ; } e l s e { c o u t< <" E s c r e v e n d on oa r q u i v o "< <e n d l ; c o u t< <" = = = = = = = = = = = = = = = = = = = "< <e n d l ; c o u t< <" I n f o r m eon o m ed ac l a s s e :" ; g e t l i n e ( c i n ,d a t a ) ; o u t f i l e< <d a t a < <e n d l ; c o u t< <" I n f o r m eon m e r od ee s t u d a n t e s :" ; c i n> >d a t a ; c i n . i g n o r e ( ) ; o u t f i l e< <d a t a < <e n d l ; o u t f i l e . c l o s e ( ) ; } i f s t r e a mi n f i l e ; s t a t u s=r e a d F i l e ( i n f i l e ," s t u d e n t s . d a t " ) ; i f( ! s t a t u s ) { c o u t< <" Oa r q u i v on op o d es e ra b e r t op a r al e i t u r a . \ n " ; c o u t< <" P r o g r a m at e r m i n a n d o . . . \ n " ; r e t u r n0 ; } e l s e { c o u t< <" L e n d od oa r q u i v o "< <e n d l ; c o u t< <" = = = = = = = = = = = = = = = = = = = = = "< <e n d l ; g e t l i n e ( i n f i l e ,d a t a ) ; w h i l e ( ! i n f i l e . f a i l ( ) ) { c o u t< <d a t a< <e n d l ; g e t l i n e ( i n f i l e ,d a t a ) ; } i n f i l e . c l o s e ( ) ; } # i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

b o o lw r i t e F i l e( o f s t r e a m &f i l e ,c h a r *s t r F i l e ) { f i l e . o p e n ( s t r F i l e ) ; r e t u r n! ( f i l e . f a i l ( ) | | ! f i l e . i s _ o p e n ( ) | | ! f i l e . g o o d ( ) ) ; } b o o lr e a d F i l e( i f s t r e a m &i f i l e ,c h a r *s t r F i l e ) { i f i l e . o p e n ( s t r F i l e ) ; r e t u r n! ( i f i l e . f a i l ( ) | | ! i f i l e . i s _ o p e n ( ) | | ! i f i l e . g o o d ( ) ) ; }

Manipuladores
Os objetos das classes "stream" podem ser configurados para fornecer e reportar os dados de maneira pr-formatada. Da mesma maneira que temos a formatao quando usamos funes de formatao, como printf() e scanf(), na linguagem C, podemos usar os manipuladores na linguagem C++ para informar os objetos
http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 11/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

streams em que formato desejamos receber os dados deles ou fornecer para eles. Abaixo temos uma srie de manipuladores teis: Manipulator boolalpha noboolalhpa (padro) dec (padro) hex oct left right internal noshowbase (padro) showbase noshowpoint (padro) showpoint noshowpos (padro) showpos skipws (padro) noskipws fixed (padro) Scientific nouppercase (padro) uppercase Uso Faz com que variveis tipo bool sejam reportadas como "true" ou "false". Faz com que variveis tipo bool sejam reportadas omo 0 ou 1. Determina que variveis tipo inteiras (int) sejam reportadas na base 10. Determina que variveis tipo inteiras (int) sejam reportadas em hexadecimal. Determina que variveis tipo inteiras (int) sejam reportadas em octal. Faz com que textos sejam justificados a esquerda no campo de sada. Faz com que textos sejam justificados a direita no campo de sada. Faz com que o sinal de um nmero seja justificado a esquerda e o nmero seja justificado a direita. Desativa a exibio do prefixo que indica a base do nmero. Ativa a exibio do prefixo que indica a base do nmero. Mostra o ponto decimal apenas se uma parte fracionria existe. Mostra o ponto decimal sempre. Nenhum sinal "+" prefixado em nmeros positivos. Mostra um sinal "+" prefixado em nmeros positivos. Faz com que espaos em branco, tabulaes, novas linhas "\n" sejam descartados pelo operador de entrada >>. Faz com que espaos em branco, tabulaes, novas linhas "\n" no sejam descartados pelo operador de entrada >> Faz com que nmeros com ponto flutuante sejam mostrados em notao fixa. Faz com que nmeros com ponto flutuante sejam mostrados em notao cientfica. 0x mostrado para nmeros em hexadecimal e para notao cientfica. 0X mostrado para nmeros em hexadecimal e para notao cientfica.

Ajustando a largura da entrada/sada


setw(w) - Ajusta a largura da sada e entrada para w; precisa ser includo. width(w) - Uma funo membro das classes iostream.
http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 12/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Preenchimento de espaos em branco


setfill(ch) - Preenche os espaos em branco em campos de sada com ch; precisa ser includo. fill(ch) - Uma funo membro das classes iostream.

Ajustando a preciso
setprecision(n) - Ajusta a preciso de casas decimais em nmeros com ponto flutuante, para n dgitos. Este ajuste apenas visual, de forma que o manipulador no afeta o modo de clculo do nmero pelo programa. Exemplificando o uso de manipuladores:

# i n c l u d e< i o s t r e a m > # i n c l u d e< i o m a n i p > # i n c l u d e< s t r i n g > u s i n gn a m e s p a c es t d ; i n tm a i n ( ) { i n ti n t V a l u e=1 5 ; c o u t< <" N m e r oi n t e i r o "< <e n d l ; c o u t< <" P a d r o :"< <i n t V a l u e< <e n d l ; c o u t< <" O c t a l :"< <o c t< <i n t V a l u e< <e n d l ; c o u t< <" H e x a d e c i m a l :"< <h e x< <i n t V a l u e< <e n d l ; c o u t< <" A t i v a n d os h o w b a s e"< <s h o w b a s e< <e n d l ; c o u t< <" D e c i m a l :"< <d e c< <i n t V a l u e< <e n d l ; c o u t< <" O c t a l :"< <o c t< <i n t V a l u e< <e n d l ; c o u t< <" H e x a d e c i m a l :"< <h e x< <i n t V a l u e< <e n d l ; c o u t< <" D e s a t i v a n d os h o w b a s e"< <n o s h o w b a s e< <e n d l ; c o u t< <e n d l ; d o u b l ed o u b l e V a l=1 2 . 3 4 5 6 7 8 ; c o u t< <" N m e r o sc o mp o n t of l u t u a n t e "< <e n d l ; c o u t< <" P a d r o :"< <d o u b l e V a l< <e n d l ; c o u t< <s e t p r e c i s i o n ( 1 0 ) ; c o u t< <" P r e c i s od e1 0 :"< <d o u b l e V a l< <e n d l ; c o u t< <s c i e n t i f i c< <" N o t a oc i e n t f i c a :"< <d o u b l e V a l< <e n d l ; c o u t< <u p p e r c a s e ; c o u t< <" C a i x aa l t a :"< <d o u b l e V a l< <e n d l ; c o u t< <e n d l ; b o o lt h e B o o l=t r u e ; c o u t< <" B o o l e a n o "< <e n d l ; c o u t< <" P a d r o :"< <t h e B o o l< <e n d l ; c o u t< <b o o l a l p h a< <" B o o l A l p h aa t i v o :"< <t h e B o o l< <e n d l ; c o u t< <e n d l ; s t r i n gm y N a m e=" J o h n " ; c o u t< <" S t r i n g s "< <e n d l ; c o u t< <" P a d r o :"< <m y N a m e< <e n d l ; c o u t< <s e t w ( 3 5 )< <r i g h t< <" C o ms e t w ( 3 5 )e\ " r i g h t \ " :"< <m y N a m e< <e n d l ; c o u t . w i d t h ( 2 0 ) ; c o u t< <" C o mw i d t h ( 2 0 ) :"< <m y N a m e< <e n d l ; c o u t< <e n d l ; # i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2

13/14

25/3/2014

Programar em C++/Entrada e sada de dados 2 - Wikilivros

Exerccios
1. Quero colocar num documento, uma lista das combinaes possveis entre a,b,c e d. com a respectiva ordenao e quantidade; 2. . Quero que seja a pessoa a escolher o nome do ficheiro (arquivo) e escrever tambm a localizao; 3. . Quero que seja depois tansformado num sistema modular; 4. . Encontrar uma maneira para contar o n de espaos em branco, o n de caracteres "." que quisermos de um dado documento.

# i n c l u d e< i o s t r e a m > # i n c l u d e< f s t r e a m > u s i n gn a m e s p a c es t d ; i n tm a i n ( ) { i n tb l a n k _ c o u n t=0 ; i n tc h a r _ c o u n t=0 ; i n ts e n t e n c e _ c o u n t=0 ; c h a rc h ; i f s t r e a mo b j e c t ( " j o . t x t " ) ; i f( !o b j e c t ) { c o u t< <" E r r oa b r i n d oa r q u i v o . "< <e n d l ; r e t u r n1 ; } w h i l e( o b j e c t . g e t ( c h ) ) { s w i t c h( c h ) { c a s e'' : b l a n k _ c o u n t + + ; b r e a k ; c a s e' \ n ' : c a s e' \ t ' : b r e a k ; c a s e' . ' : s e n t e n c e _ c o u n t + + ; b r e a k ; d e f a u l t : c h a r _ c o u n t + + ; b r e a k ; } } c o u t< <" E x i s t e m"< <b l a n k _ c o u n t< <"e s p a o se mb r a n c o ; "< <e n d l ; c o u t< <" E x i s t e m"< <c h a r _ c o u n t< <"c a r a c t e r e s ; "< <e n d l ; c o u t< <" E x i s t e m"< <s e n t e n c e _ c o u n t< <"s e n t e n a s . "< <e n d l ; # i f d e fW I N 3 2 s y s t e m( " p a u s e " ) ; # e n d i f } r e t u r n0 ;

Obtido em "http://pt.wikibooks.org/w/index.php? title=Programar_em_C%2B%2B/Entrada_e_sada_de_dados_2&oldid=256748" Categoria: Livro/Programar em C++ Esta pgina foi modificada pela ltima vez (s) 23h21min de 28 de maio de 2013. Este texto disponibilizado nos termos da licena Creative Commons Atribuio-Compartilhamento pela mesma Licena 3.0 Unported; pode estar sujeito a condies adicionais. Consulte as Condies de Uso para mais detalhes.
http://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Entrada_e_sa%C3%ADda_de_dados_2 14/14

You might also like