You are on page 1of 32

Programao em C++

Entrada e sada de dados

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Biblioteca de Streams do C++


As aces de entrada e sada de dados no fazem parte da linguagem C++. Por forma a uniformizar as primitivas atravs das quais um programa invoca as aces de I/O (entrada e sada de dados) a linguagem C++ virtualiza todos os dispositivos envolvidos nestas aces como objectos streams. A linguagem C++ dispe de uma biblioteca de classes stream, cujas declaraes se situam nos ficheiros iostream.h, iomanip.h e fstream.h, satisfazendo ao paradigma da Programao Orientada por Objectos.

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-2

Biblioteca de Streams do C++


Todos os dispositivos lgicos (streams) so semelhantes em comportamento, e bastante independentes dos dispositivos reais. Distinguem-se dois tipos de streams - streams para texto e streams para palavras binrias Um stream, associa-se a um perifrico realizando uma operao abertura (open), e desassocia-se dele com uma operao de fecho (close).

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-3

cin e cout
As streams cin e cout tornam-se a interface entre o programa e o utilizador, para interactuar com o keyboard e com o ecr. O stream cin criado automaticamente quando se inclui o ficheiro header <iostream.h> ficando associado ao keyboard do terminal.

O stream cout criado automaticamente quando se inclui o ficheiro header <iostream.h> ficando associado ao ecr do terminal
extern istream cin; extern ostream cout;
Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-4

Sada de dados - operador << (1)


int x = 27; ... cout << x; // operao 1 cout << endl; // operaes 2 e 3

stream cout

1 converter o inteiro 27 nos caracteres '2','7' e coloc-los no buffer 2 colocar o caracter "mudana de linha no buffer".

27

buffer
'2' '7' '\n' . . .

27 _

3 Fazer flush ao buffer, ou seja, escrever todo o conteudo do buffer no ecr

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-5

Sada de dados - operador << (2)

O operador insersor <<, retorna uma referncia para o ostream sobre o qual operou, pelo que se podem concatenar inseres numa mesma expresso.

void main() int i= 10, double d= 3.1456; cout << "i =" << i << ", d=" << d << endl; /* Equivalente a: cout << "i =; // insere a string "i =" cout << i; // insere o valor inteiro de i cout << ", d=" ; // insere a string cout << d; // insere o valor real de d cout << endl; // insere o caracteres \r\n e //faz flush do buffer. } */

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-6

Entrada de dados - operador >> (1)


int x; char y[7]; ... cin >> x;// operao 2 cin >> y; // operao 3

stream cin
buffer
2 ' ' '0' '0' '2' '7' ' ' ' ' 'x' 'p' 't' 'o' '\n' Digitou-se: " 0027 xpto<Return>"

27

ignorou-se o espao inicial e converteram-se os digitos '0','0','2','7' para o valor inteiro 27

'x' 'p' 't' 'o' 0 ? ?


3

1 Quando foi digitado o <return> preencheu-se o buffer com a linha completa

ignorou-se os espaos e leu-se as letras 'x','p','t','o' para o array colocando um <zero> a seguir ao 'o' para terminar a string.

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-7

Entrada de dados - operador >> (2)


O operador extractor >>,toma como operando esquerdo um istream e como operando direito a varivel a afectar com o valor extrado do istream.
void main() { char c; int i; char str[10]; float f; cin >> c >> i >> f >> str; /* Equivalente a: cin >> c; // extrai um carcter // diferente de separador. cin >> i; // extrai um valor inteiro. cin >>f; // extrai um valor real. cin >> str;// extrai uma palavra. */

O operando direito pode ser qualquer dos tipos intrnseco do C++, pois em <iostream.h> esto definidos vrias verses do operador insersor .
Por omisso, salta espaos em branco (como definido na funo isspace() em <ctype.h>), lendo seguidamente os caracteres adequados ao tipo de objecto que vai ser afectado.

cout << "c = " << c << endl << "i = " << i << endl << "f = << f << endl << "str = " << str << endl;

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-8

Mtodos de entrada e sada e no formatada


get
istream & get(char &ch); // l um nico caracter;
// Ex . - Copiar uma linha do standard input para o standard output
#include <iostream.h> void main() { char ch; do { cin.get(ch); cout << ch; } while (ch!= '\n'); }

putback

istream::putback(char ch); // Torna a repor o caracter no buffer de input


// Ex. - Consumir espaos em branco #include <iostream.h> #include <ctype.h> istream& eatwhite( istream& is ) { char c; while (is.get(c)) { if ( ! isspace (c) ) { is.putback(c); // Colocar no buffer o caracter diferente de separador break; } } return is; }

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3-9

Mtodos de entrada e sada e no formatada


getline
istream::getline( char *line, int size, char terminator) /* Os caracteres so extrados at que uma das seguintes condies se verifiquem: - size-1 caracteres sejam lidos; - no existam mais caracteres para ler (EOF - fim de ficheiro); - o caracter lido seja o caracter terminador. Neste caso, o caracter lido mas no inserido no vector line. No fim da sequncia de caracteres sempre inserido o caracter nulo (\0), logo a dimenso mxima da string size-1 caracteres . Ex . - Digitar uma linha terminada por 'p' */ #include <iostream.h> void main() { char line[100]; cout << " Digite uma linha terminado por 'p'" << endl; cin.getline( line, 100, 'p' );// 'p' caracter terminador cout << line; }

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 10

Funes para filtrar caracteres


As funes seguintes, reconhecem tipos de caracteres retornando true ou false conforme o caracter testado satisfizer ou no a condio da funo evocada.

int int int int int int int int int int int int

isdigit(char) islower(char) isupper(char) isalpha(char) isalnum(char) isxdigit(char) isascii(char) iscntrl(char) isgraph(char) isprint(char) ispunct(char) isspace(char)

// '0' .. '9' // 'a' .. 'z // 'A' .. 'Z' // islower() | isupper() // isalpha() | isdigit() // '0' .. '9' 'a' .. 'f' 'A' .. 'F' // 0 .. 0x7F //caracteres de control //isalpha() | isdigit() | ispunct () // printable: ascii entre ' ' e '~' // pontuao // ' ' '\t' CR LF

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 11

Manipuladores
Manipulador In Out Definio

Existem manipuladores para streams, de entrada (mudam o formato das extraces) e/ou de sada (mudam o formato das inseres)

endl ends flush dec hex oct v v v v v

v Mudar de linha e flush do ostream. v Inserir \0 para terminar string. v Esvaziar (flush) o buffer do ostream. v Converso para base decimal. v Converso para base hexadecimal. v Converso para base octal. Eliminar caracteres separadores. v Fixar a base de converso em b. v Desactivar bit-vector flags de acordo com b. Ver v Activar os bit-vector flags de acordo com b. Ver v Definir o carcter de preenchimento de espaos do campo com (char)f v Situar em n dgitos a preciso de um floatingpoint. v v Colocar em n caracteres a largura do campo.

Os manipuladores esto declarados em <iomanip.h>. Eis os mais comuns :

ws setbase(int b)

resetiosflags(long b) v setiosflags(long b) setfill(int f) setprecision(int n) setw(int n) v

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 12

Manipuladores - exemplo
#include<iostream.h> #include<iomanip.h> #include<conio.h> void main() { clrscr(); int i=123; double d=12345.6789; char *s= "blabla"; cout << setw(10) << s << endl << i << endl << setw(10) << i << endl << d << endl << setw(15) << setfill('*') << d << endl << setw(13) << setfill(' ') << setprecision(3) << setiosflags(ios::left) << d << s << endl; }

Qual o output deste programa :

blabla 123 123 12345.6789 *****12345.6789 12345.679 blabla

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 13

Flags de formatao de um stream


Flag ios::skipws ios::left ios::right ios::internal ios::dec ios::hex ios::oct ios::fixed ios::scientific ios::showbase ios::showpoint ios:: showpos ios::uppercase v v v In v v v v v v v v v v v v v Out Definio Salta espaos em branco no input. Espaos esquerda. Espaos direita. Espaos entre o sinal e o valor. Converso para base decimal. Converso para base hexadecimal. Converso para base octal. Usa a notao 123.45 para os floating point. Usa a notao 1.2345E2 para os floating point. Fora a escrita da base. Fora a escrita do ponto (floating point). Adiciona o '+' nos inteiros positivos. Escreve em maisculas quando a base hexadecimal.

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 14

Acesso a ficheiros
Podem ser definidos objectos associados a ficheiros, e passar a interactuar com esses objectos com os mesmos operadores, mtodos e manipuladores que se utilizam para cin e cout. Existem vrios objectos que podemos criar para ter acesso a ficheiros:
ifstream - quando queremos abrir um ficheiro para leitura. ofstream - quando queremos abrir um ficheiro para escrtita. fstream - quando se deseja que o ficheiro possa ser lido e escrito.

Para criar qualquer um dos tipos de objectos anteriores, teremos de explicitamente proceder aos vrios passos da definio, que nos so ocultos no caso de cin e cout.

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 15

Mtodos open() e close() sobre streams


Acesso a um ficheiro para leitura.
#include <fstream.h> ifstream is; // ficheiro de input // Abrir o ficheiro para ler. is.open(c:\mensage\text1.doc);

Acesso a um ficheiro para escrita.


#include <fstream.h> ofstream os; // ficheiro de output // Abrir o ficheiro para escrita. os.open(c:\mensage\text2.doc);

Equivale a:
ifstream is(c:\mensage\text1.doc);

Equivale a:
ofstream os(c:\mensage\text2.doc);

O mtodo close() garante: que toda a informao situada no buffer transferida para ficheiro em disco, e que as estruturas de dados inerentes organizao do disco sejam devidamente actualizadas.

is.close(); // Fechar o ficheiro de input


os.close(); // Fechar o ficheiro de output

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 16

Teste de erro na abertura de um fstream


No caso de uma aco de open() sobre um fstream no ser bem conseguida, por qualquer motivo, esse facto pode ser reconhecido em programa, testando o objecto stream como valor lgico.

Cpia do ficheiro file.in para file.out

ifstream input("file.txt") ; if (!input) { cout << "Sarilhos " << endl; exit(0); }

#include<fstream.h> #include<iostream.h> #include <stdlib.h> void main() { char ch; ifstream f1("file.in"); if (!f1) { // Teste ao estado da fstream input cout << "Cannot open 'file.in' for input" << endl; exit(0); } ofstream f2("file.out"); if (!f2) { // Teste ao estado da fstream de output cout << "Cannot open 'file.out' for output" << endl; exit(0); } while ( f1.get(ch) ) f2.put(ch); f1.close(); f2.close(); cin.get(); }

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 17

Modos de acesso de um fstream


Ao contrrio de objectos do tipo ifstream e ofstream, que tm modos de acesso pr- estabelecidos, os objectos do tipo fstream, podem ter acesso para escrita, para leitura, ou ambos. A iniciao de um objecto fstream pode ser efectuada com um nico parmetro string, mas tambm podemos explicitar num segundo parmetro a especificao de modos alternativos de acesso.
M o d e b it
ios::app ios::ate ios::in ios::out ios::binary ios::trunc ios::nocreate ios::noreplace

Aco
A p p e n d d a t a - E s c r e v e n o f im d o f ic h e ir o P o s ic io n a - s e n o f im d o f ic h e ir o in ic ia lm e n t e A b r e o f ic h e ir o p a r a le it u r a A b r e o f ic h e ir o p a r a e s c r it a A b r e o f ic h e ir o e m m o d o b in r io D e s p r e z a o a n t e r io r c o n t e d o d o f ic h e ir o . F a lh a a a c o s e n o e x is t ir o f ic h e ir o S e o f ic h e ir o e x is t ir , f a lh a a b e r t u r a ( o p e n ) p a r a s a d a , a m e n o s q u e a t e o u a p p e s t e j a m a c t iv a s .

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 18

3-10

Restries dos fstreams

Todos os operadores, funes e manipuladores usados para de cin e cout, podem, sem nenhuma alterao sintctica, ser aplicados a ficheiros abertos em modo de texto para leitura ou para escrita. Os ficheiros prestam-se a aces que no so comuns utilizar sobre o teclado e ecr. Nomeadamente o acesso aleatrio ou o posicionamento especificado. Os operadores insersores e extractores esto vocacionadas para ficheiros de texto.

Para ficheiros binrios so usados os mtodos get(), put(), read() e write()


Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 19

Modos de abertura - exemplos (1)


Por omisso do segundo parametro, um ifstream aberto no modo leitura de texto e um ofstream aberto no modo escrita de texto Abertura para leitura com ifstreams e para escrita com ofstreams

ifstream in ("t1.doc"); // fstream in("t1.doc", ios::in); ofstream out("t2.doc"); // fstrteam out(t2.doc, ios::out | ios::trunc); Abertura de ficheiros em modo binrio Abertura para leitura e escrita com fstreams

ifstream in ("t1", ios::binary); ofstream out("t2", ios::binary);

fstream inOut("t1.doc", ios:in | ios::out); // texto fstream inOut("t1.doc", ios:in | ios::out | ios::binary);// binrio
Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 20

Modos de abertura - exemplos (2)


Abertura para escrita com posicionamento no fim do ficheiro.

// fich. texto com escrita no fim ofstream out("t1.doc", ios:app); // fich. binrio com escrita no fim ofstream out("t1.doc", ios:app | ios::binary); // fich. texto com posicionamento no fim e com possibilidade de acesso directo ofstream out ("t1.doc", ios:ate); // fich. binrio com posicionamento no fim e com possibilidade de acesso directo ofstream out ("t1.doc", ios:ate | ios::binary);
Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 21

Mtodo write()
write
ostream& write(const char* ptr, int n); ostream& write(const signed char* ptr, int n); ostream& write(const unsigned char* ptr,int n);

Insere no stream n caracteres. Se o ficheiro for de texto virtualiza o caracter '\n' , num par ('\r', '\n'). vocacionada para registar estruturas de dados em ficheiros binrios, embora possa ser usada em ostream na generalidade.

Armazenar uma data em ficheiro


#include <fstream.h> struct Date { int mo, da, yr; } void main() { Date dt = { 6, 10, 91 }; ofstream tfile( "date.dat" , ios::binary ); tfile.write( (char *) &dt, sizeof dt ); }

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 22

Mtodo read()
read
ostream& read(char* ptr, int n); ostream& read(signed char* ptr, int n); ostream& read(unsigned char* ptr, int n); Teste do mtodo read()

O mtodo read() vocacionada para a leitura de estruturas de dados de ficheiros binrios, embora possa ser usada noutro tipo de istreams.

#include <iostream.h> #include <fstream.h> void main() { struct { double salary; char name[23]; } employee; ifstream is( "payroll", ios::binary | ios::nocreate ); if( is ) { // ios::operator void*()

is.read( (char *) &employee, sizeof( employee ) );


cout << employee.name << ' ' << employee.salary << endl; } else cout << "ERROR: Cannot open file 'payroll'." << endl; }

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 23

Acesso aleatrio a ficheiros


Declarado um fstream associado a um dado ficheiro, com um modo de acesso (segundo parmetro) simultaneamente para entrada e sada:

fstream farray("Array", ios:: in | ios::out| ios::binary);

O ficheiro criado pode ser utilizado para virtualizar em disco um array com acesso por ndice para ler e escrever em qualquer dos seus elementos. O mtodo seekg(long n), posiciona no byte n (a contar do inicio do ficheiro), o que permite alterar o acesso ao ficheiro para aces de leitura (get). O mtodo seekp(long n), posiciona no byte n para escrita(put), o que permite alterar o acesso ao ficheiro para aces de escrita.
Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 24

Inverso de um ficheiro de inteiros


#include <fstream.h>

#include <iostream.h>
#include <iomanip.h> fstream farray("intArray", ios:: in | ios::out| ios::binary); const int NUMINT = 100; void main() { for (int i = 0; i < NUMINT; ++i) farray.write((char *) &i, sizeof(int));// escreve

for (int begin = 0, end = NUMINT -1; begin < NUMINT/2; ++begin, --end )
int auxBegin, auxEnd; farray.seekg(begin * sizeof(int)); farray.seekg(end * sizeof(int)); farray.seekp(begin * sizeof(int)); farray.seekp(end * sizeof(int)); } } // l o inteiro cuja posio begin // l o inteiro cuja posicao end farray.read((char *) &auxBegin, sizeof(int)); farray.read((char *) &auxEnd, sizeof(int));

// escreve o valor do auxEnd inteiro na posio begin // escreve o valor do auxBegin inteiro na posicao end

farray.write((char *) &auxEnd, sizeof(int));


farray.write((char *) &auxBegin, sizeof(int));

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 25

Hierarquia iostream

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 26

Aces de I/O directas sobre o terminal

As primitivas de I/O comunicam directamente com o dispositivo fsico (contrariamente s streams). Estas primitivas no constam nas bibliotecas standard do C++, no entanto so necessrias em algumas aplicaes :
Recolha directa de caracteres sem edio de linha, ou seja, sem ser necessrio aguardar a actuao da tecla <ENTER> ou <RETURN> para que o carcter fique disponvel. Recolha de caracteres com ou sem eco no ecr. Obter informao do teclado acerca da existncia ou no de caracteres j disponveis para recolha, permitindo realizar outras operaes enquanto os caracteres no estejam disponveis.

Em PCs as declaraes das aces directas sobre o terminal (consola) esto disponveis no ficheiro <conio.h>

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 27

Funo getch()
int getch( )
Recolhe caracteres do teclado sem a actuao da tecla <ENTER> e sem eco Devolve o cdigo da tecla premida As teclas de aco (F1 a F12, Insert, Home, , , , , etc.), geram dois cdigos:
1: Sem significado (0, 224, etc). 2: Cdigo especfico da tecla. Para recolher informao sobre estas teclas necessrio evocar a funo por duas vezes.
Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Deteco de teclas de aco

#include <iostream.h> #include <ctype.h> #include <conio.h> void main() { unsigned char ch; // unsigned para codigo > 127 do { cout << "\nPrima uma tecla (terminar '*')" << endl; ch = (unsigned char)getch(); // Testar se o primeiro cdigo de aco. O primeiro // cdigo pode ser 0 ou 224. if( ch==0 || ch==224 ) cout << "Tecla de accao com codigo " << (unsigned int) getch() << endl; else { cout << "A tecla nao e de accao"; if ( isprint(ch) ) cout << ", corresponde ao caracter " << ch; cout << ", tem o codigo " << (unsigned) ch << endl; } } while ( ch != '*' ); }

Entrada e sada de dados

3 - 28

Funo getche()
getche( )
Ler teclas e escrever o correspondente cdigo.

Idntica funo getch(), s que faz eco do caracter premido.

#include <iostream.h> #include <conio.h> void main() { int ch; do { cout << "Prima uma tecla alfanumerica - " << flush; ch = getche(); cout << "\nTecla com o codigo ASCII " << ch << endl; } while ( ch != '*' ); }

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 29

Funo putch()
putch(char ch)

Ler teclas e ecoar em maisculas.

Coloca directamente na consola o caracter cujo cdigo ch.

#include <conio.h> #include <ctype.h> void main() { char ch; do { putch( toupper( ch = (char) getch() ) ); if (ch == '\r') putch('\n'); } while (ch != '*'); }

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 30

Funo kbhit()
Int kbhit ( )
Testa se uma tecla foi ou no actuada.
Faz uma espera activa, escrevendo caracteres . enquanto no for premida uma tecla.

#include <iostream.h> #include <conio.h> #include <ctype.h> void main(){ do { while( ! kbhit() ) putch('.'); getch();

//Consumir carcter de paragem. //Recolher 'S' ou 'N' .

cout << "\nQuer continuar (S/N)? " << flush; } } while( toupper(getch()) == 'S' );

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 31

Manipulao de strings
O ficheiro <string.h> dispe da declarao dos prottipos das funes de manipulao de strings. int strlen(char *str);
Recebe uma string como parmetro e devolve a sua dimenso.

char *strcpy( char *dst, const char *src );


Copia a string src para a string dst e devolve um apontador para a string dst.

int strcmp( const char *str1, const char *str2 );


Compara str1 com str2 e devolve : 0 se str1 = str2; < 0 se str1 < str2; > 0 str1 > str2.

char *strcat( char *dst, const char *src );


Concatena a string src, string dst e devolve um apontador para a string dst.

char *strstr( const char *str, const char *str1 );


Procura a ocorrncia de str1 em str. Devolve um apontador para a 1 ocorrncia de str1 em str, ou NULL caso no exista.

char *strchr( const char *str,int c);


Procura a ocorrncia do caracter c str. Devolve um apontador para a 1 ocorrncia c em str, ou NULL caso no exista.

Programao em C++
Pimenta Rodrigues Pedro Pereira Manuela Sousa

Entrada e sada de dados

3 - 32

You might also like