Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Programação em C++

Slides:



Advertisements
Apresentações semelhantes
Estruturação de Linguagens (Pascal e C++)
Advertisements

TRATAMENTO DE ARQUIVOS EM C
Python: Entrada e Saída
Um programa em C Bibliotecas Variáveis globais
© Copyright 2008 Algoritmos e Estruturas de Dados IF672ec - Algoritmos e Estruturas de Dados CIn - UFPE { alp4, dnq, dwcs, fmm, jdf2, lfpd, mraga, psbof,
Prof. Luis Otavio Alvares
Arquivos Prof: Erivelto Tschoeke, Msc. –
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Linguagem de Programação 1
Curso de C/C++ Avançado
Linguagem C Strings.
Armazenamento de Dados em Arquivos
Linguagem C Strings.
Armazenamento de Dados em Arquivos
Escola Secundária c/ 3º CEB da Batalha
Tratamento de Ficheiros
Revisão da Linguagem C.
Tópicos Tipos de Dados Variáveis por Valor Variáveis por Referência
Capítulo 10 Strings & File I/O. Strings Strings são um conjunto de Caracteres ASCII. No Controle de Instrumentação pode-se converter valores numéricos.
O.NET introduziu um forma orientada a objetos de trabalhar com arquivos. O namespace System.IO fornece diversas classes para trabalhar com arquivos textos,
Iniciação à linguagem C++
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
1 programa dados Utilização de ficheiros externos A maneira mais simples de escrever para um ficheiro externo é redireccionar a saída de um programa: em.
1 programa dados Utilização de ficheiros externos A maneira mais simples de escrever para um ficheiro externo é redireccionar a saída de um programa: em.
PROGRAMAÇÃO ESTRUTURADA II
Ordenação e Pesquisa de Dados Marco Antonio Montebello Júnior
CADEIA DE CARACTERES (Strings)
Manipulação de Arquivos em C
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Streams –input e output
DAVID ANDERSON CARDOSO DANTAS
Aula Prática 12 Operações com Arquivos Monitoria
Computação Eletrônica
Programação em C++ Compiladores
Aula 13 - Armazenamento de Dados em Arquivos
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Arquivo.
Procedimentos Pré-definidos em prolog comunicação
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagens de Programação – DEL-Poli/UFRJ Prof. Miguel Campista Linguagens de Programação Prof. Miguel Elias Mitre Campista
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
ARQUIVOS.
Programação e Sistemas de Informação
Tratamento de ficheiros Abrir e fechar um ficheiro.
Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída.
Introdução à Linguagem C
Aula Prática 11 Operações com Arquivos Monitoria
18/19 de Maio de 2004Registos em Ficheiros1 Pedro Barahona DI/FCT/UNL Maio 2004.
Algoritmos e Estruturas de Dados
Operações com Arquivos Monitoria A estrutura FILE  É como um tipo de dado, mas não é um tipo propriamente dito  Definido no arquivo cabeçalho.
M ÉTODOS DA C LASSE S TRING. FUNÇÕES COM STRING Uma string é um tipo texto que corresponde à união de um conjunto de caracteres. Em Java, as strings são.
STRINGS Dilvan Moreira (baseado no livro Big Java e Z. Liang)
Aula Prática 11 Operações com Arquivos Monitoria
Prof. Alessandro Gonçalves
Programação de Computadores I – Arquivos
Salvando em Arquivos. Arquivos Um arquivo pode estar associado a qualquer dispositivo de entrada e saída, como por exemplo: teclado, video, impressora,
 2000 Prentice Hall, Inc. All rights reserved. 1 Capítulo 8 - Caracteres e Strings Sumário 8.1Introdução 8.2Conceitos Fundamentais de Strings e Caracteres.
Programação Computacional Aula 8: Entrada e Saída pelo Console Prof a. Madeleine Medrano
Algoritmo e Estrutura de Dados I Aulas 12 – Linguagem C Strings Márcia Marra
 O que são arrays:  estruturas de dados homogêneas  coleção de elementos do mesmo tipo referenciada por um nome comum  um array pode ser imaginado.
Profa. Maria Augusta Constante Puget
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
USP – ICMC – SSC SSC0300 2º Semestre 2015 Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Eletrônica ] 1 Prof. Dr. Daniel Rodrigo.
Programação II Arquivos Autoria: Ernani Santos Modificação: Clebson Oliveira Adaptação: Claudia Boeres.
Programação de Computadores I – Arquivos Profa. Mercedes Gonzales Márquez.
Fundamentos de Programação 1 Slides 18 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Seqüências ou de Texto ”.
Fundamentos de Programação 1 Slides 19 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Binários”.
Arquivos textos (text)
Estrutura de Dados STRUCTS Dilvan Moreira. Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)
Fundamentos de Programação 1 Slides 18 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Seqüências ou de Texto ”. 1.
Transcrição da apresentação:

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Programação em C++

3 - 2 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados As acções de entrada e saída de dados não fazem parte da linguagem C++. Por forma a uniformizar as primitivas através das quais um programa invoca as acções de I/O (entrada e saída de dados) a linguagem C++ virtualiza todos os dispositivos envolvidos nestas acções como objectos streams. A linguagem C++ dispõe de uma biblioteca de classes stream, cujas declarações se situam nos ficheiros iostream.h, iomanip.h e fstream.h, satisfazendo ao paradigma da Programação Orientada por Objectos. Biblioteca de Streams do C++

3 - 3 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Biblioteca de Streams do C++ Todos os dispositivos lógicos (streams) são semelhantes em comportamento, e bastante independentes dos dispositivos reais. Distinguem-se dois tipos de streams - streams para texto e streams para palavras binárias Um stream, associa-se a um periférico realizando uma operação abertura (open), e desassocia-se dele com uma operação de fecho (close).

3 - 4 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados 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 ficando associado ao keyboard do terminal. O stream cout é criado automaticamente quando se inclui o ficheiro header ficando associado ao ecrã do terminal cin e cout extern istream cin; extern ostream cout;

3 - 5 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Saída de dados - operador << (1)

3 - 6 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Saída de dados - operador << (2) O operador insersor <<, retorna uma referência para o ostream sobre o qual operou, pelo que se podem concatenar inserções numa mesma expressão. void main() int i= 10, double d= ; 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. */ }

3 - 7 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Entrada de dados - operador >> (1)

3 - 8 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Entrada de dados - operador >> (2) O operador extractor >>,toma como operando esquerdo um istream e como operando direito a variável a afectar com o valor extraído do istream. O operando direito pode ser qualquer dos tipos intrínseco do C++, pois em estão definidos várias versões do operador insersor. Por omissão, salta espaços em branco (como definido na função isspace() em ), lendo seguidamente os caracteres adequados ao tipo de objecto que vai ser afectado. void main() { char c; int i; char str[10]; float f; cin >> c >> i >> f >> str; /* Equivalente a: cin >> c; // extrai um carácter // diferente de separador. cin >> i; // extrai um valor inteiro. cin >>f; // extrai um valor real. cin >> str;// extrai uma palavra. */ cout << "c = " << c << endl << "i = " << i << endl << "f = ” << f << endl << "str = " << str << endl; }

3 - 9 Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados istream & get(char &ch); // lê um único caracter; // Ex. - Copiar uma linha do standard input para o standard output #include void main() { char ch; do { cin.get(ch); cout << ch; } while (ch!= '\n'); } istream & get(char &ch); // lê um único caracter; // Ex. - Copiar uma linha do standard input para o standard output #include void main() { char ch; do { cin.get(ch); cout << ch; } while (ch!= '\n'); } Métodos de entrada e saída e não formatada istream::putback(char ch); // Torna a repor o caracter no buffer de input // Ex. - Consumir espaços em branco #include 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; } istream::putback(char ch); // Torna a repor o caracter no buffer de input // Ex. - Consumir espaços em branco #include 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; } getputback

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Métodos de entrada e saída e não formatada istream::getline( char *line, int size, char terminator) /* Os caracteres são extraídos até que uma das seguintes condições se verifiquem: - size-1 caracteres sejam lidos; - não existam mais caracteres para ler (EOF - fim de ficheiro); - o caracter lido seja o caracter terminador. Neste caso, o caracter é lido mas não é inserido no vector line. No fim da sequência de caracteres é sempre inserido o caracter nulo (‘\0’), logo a dimensão máxima da string é size-1 caracteres. Ex. - Digitar uma linha terminada por 'p' */ #include void main() { char line[100]; cout << " Digite uma linha terminado por 'p'" << endl; cin.getline( line, 100, 'p' );// 'p' é caracter terminador cout << line; } istream::getline( char *line, int size, char terminator) /* Os caracteres são extraídos até que uma das seguintes condições se verifiquem: - size-1 caracteres sejam lidos; - não existam mais caracteres para ler (EOF - fim de ficheiro); - o caracter lido seja o caracter terminador. Neste caso, o caracter é lido mas não é inserido no vector line. No fim da sequência de caracteres é sempre inserido o caracter nulo (‘\0’), logo a dimensão máxima da string é size-1 caracteres. Ex. - Digitar uma linha terminada por 'p' */ #include void main() { char line[100]; cout << " Digite uma linha terminado por 'p'" << endl; cin.getline( line, 100, 'p' );// 'p' é caracter terminador cout << line; } getline

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Funções para filtrar caracteres As funções seguintes, reconhecem tipos de caracteres retornando true ou false conforme o caracter testado satisfizer ou não a condição da função evocada. int isdigit(char) // '0'.. '9' int islower(char) // 'a'.. 'z’ int isupper(char) // 'A'.. 'Z' int isalpha(char) // islower() | isupper() int isalnum(char) // isalpha() | isdigit() int isxdigit(char) // '0'.. '9' 'a'.. 'f' 'A'.. 'F' int isascii(char) // 0.. 0x7F int iscntrl(char) //caracteres de control int isgraph(char) //isalpha() | isdigit() | ispunct () int isprint(char) // printable: ascii entre ' ' e '~' int ispunct(char) // pontuação int isspace(char) // ' ' '\t' CR LF int isdigit(char) // '0'.. '9' int islower(char) // 'a'.. 'z’ int isupper(char) // 'A'.. 'Z' int isalpha(char) // islower() | isupper() int isalnum(char) // isalpha() | isdigit() int isxdigit(char) // '0'.. '9' 'a'.. 'f' 'A'.. 'F' int isascii(char) // 0.. 0x7F int iscntrl(char) //caracteres de control int isgraph(char) //isalpha() | isdigit() | ispunct () int isprint(char) // printable: ascii entre ' ' e '~' int ispunct(char) // pontuação int isspace(char) // ' ' '\t' CR LF

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Manipuladores Existem manipuladores para streams, de entrada (mudam o formato das extracções) e/ou de saída (mudam o formato das inserções) Os manipuladores estão declarados em. Eis os mais comuns :

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Manipuladores - exemplo #include void main() { clrscr(); int i=123; double d= ; 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 ***** blabla

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Flags de formatação de um stream

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Acesso a ficheiros Podem ser definidos objectos associados a ficheiros, e passar a interactuar com esses objectos com os mesmos operadores, métodos e manipuladores que se utilizam para cin e cout. Existem vários 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 vários passos da definição, que nos são ocultos no caso de cin e cout.

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Métodos open() e close() sobre streams O método close() garante: que toda a informação situada no buffer é transferida para ficheiro em disco, e que as estruturas de dados inerentes à organização do disco sejam devidamente actualizadas. is.close(); // Fechar o ficheiro de input os.close(); // Fechar o ficheiro de output #include ifstream is; // ficheiro de input // Abrir o ficheiro para ler. is.open(“c:\mensage\text1.doc”); #include ifstream is; // ficheiro de input // Abrir o ficheiro para ler. is.open(“c:\mensage\text1.doc”); ifstream is(“c:\mensage\text1.doc”); Equivale a: Acesso a um ficheiro para leitura. #include ofstream os; // ficheiro de output // Abrir o ficheiro para escrita. os.open(“c:\mensage\text2.doc”); #include ofstream os; // ficheiro de output // Abrir o ficheiro para escrita. os.open(“c:\mensage\text2.doc”); ofstream os(“c:\mensage\text2.doc”); Acesso a um ficheiro para escrita. Equivale a:

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Teste de erro na abertura de um fstream No caso de uma acção de open() sobre um fstream não ser bem conseguida, por qualquer motivo, esse facto pode ser reconhecido em programa, testando o objecto stream como valor lógico. ifstream input("file.txt") ; if (!input) { cout << "Sarilhos " << endl; exit(0); } ifstream input("file.txt") ; if (!input) { cout << "Sarilhos " << endl; exit(0); } #include 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(); } #include 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(); } Cópia do ficheiro “file.in” para “file.out” Cópia do ficheiro “file.in” para “file.out”

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Ao contrário de objectos do tipo ifstream e ofstream, que têm modos de acesso pré- estabelecidos, os objectos do tipo fstream, podem ter acesso para escrita, para leitura, ou ambos. A iniciação de um objecto fstream pode ser efectuada com um único parâmetro string, mas também podemos explicitar num segundo parâmetro a especificação de modos alternativos de acesso. Modos de acesso de um fstream 3-10

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Restrições dos fstreams Todos os operadores, funções e manipuladores usados para de cin e cout, podem, sem nenhuma alteração sintáctica, ser aplicados a ficheiros abertos em modo de texto para leitura ou para escrita. Os ficheiros prestam-se a acções que não são comuns utilizar sobre o teclado e ecrã. Nomeadamente o acesso aleatório ou o posicionamento especificado. Os operadores insersores e extractores estão vocacionadas para ficheiros de texto. Para ficheiros binários são usados os métodos get(), put(), read() e write()

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Modos de abertura - exemplos (1) ifstream in ("t1.doc"); // fstream in("t1.doc", ios::in); ofstream out("t2.doc"); // fstrteam out(“t2.doc”, ios::out | ios::trunc); ifstream in ("t1.doc"); // fstream in("t1.doc", ios::in); ofstream out("t2.doc"); // fstrteam out(“t2.doc”, ios::out | ios::trunc); Abertura para leitura com ifstreams e para escrita com ofstreams ifstream in ("t1", ios::binary); ofstream out("t2", ios::binary); ifstream in ("t1", ios::binary); ofstream out("t2", ios::binary); Abertura de ficheiros em modo binário Por omissão do segundo paraâmetro, um ifstream é aberto no modo leitura de texto e um ofstream é aberto no modo escrita de texto fstream inOut("t1.doc", ios:in | ios::out); // texto fstream inOut("t1.doc", ios:in | ios::out | ios::binary);// binário fstream inOut("t1.doc", ios:in | ios::out); // texto fstream inOut("t1.doc", ios:in | ios::out | ios::binary);// binário Abertura para leitura e escrita com fstreams

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Modos de abertura - exemplos (2) // fich. texto com escrita no fim ofstream out("t1.doc", ios:app); // fich. binário 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. binário com posicionamento no fim e com possibilidade de acesso directo ofstream out ("t1.doc", ios:ate | ios::binary); // fich. texto com escrita no fim ofstream out("t1.doc", ios:app); // fich. binário 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. binário com posicionamento no fim e com possibilidade de acesso directo ofstream out ("t1.doc", ios:ate | ios::binary); Abertura para escrita com posicionamento no fim do ficheiro.

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Método write() #include 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 ); } #include 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 ); } 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 binários, embora possa ser usada em ostream na generalidade. ostream& write(const char* ptr, int n); ostream& write(const signed char* ptr, int n); ostream& write(const unsigned char* ptr,int n); ostream& write(const char* ptr, int n); ostream& write(const signed char* ptr, int n); ostream& write(const unsigned char* ptr,int n); write Armazenar uma data em ficheiro

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Método read() read O método read() é vocacionada para a leitura de estruturas de dados de ficheiros binários, embora possa ser usada noutro tipo de istreams. ostream& read(char* ptr, int n); ostream& read(signed char* ptr, int n); ostream& read(unsigned char* ptr, int n); ostream& read(char* ptr, int n); ostream& read(signed char* ptr, int n); ostream& read(unsigned char* ptr, int n); #include 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; } #include 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; } Teste do método read()

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Acesso aleatório a ficheiros fstream farray("Array", ios:: in | ios::out| ios::binary); Declarado um fstream associado a um dado ficheiro, com um modo de acesso (segundo parâmetro) simultaneamente para entrada e saída: 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 método seekg(long n), posiciona no byte n (a contar do inicio do ficheiro), o que permite alterar o acesso ao ficheiro para acções de leitura (get). O método seekp(long n), posiciona no byte n para escrita(put), o que permite alterar o acesso ao ficheiro para acções de escrita.

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Inversão de um ficheiro de inteiros #include 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));// lê o inteiro cuja posição é begin farray.read((char *) &auxBegin, sizeof(int)); farray.seekg(end * sizeof(int)); // lê o inteiro cuja posicao é end farray.read((char *) &auxEnd, sizeof(int)); farray.seekp(begin * sizeof(int));// escreve o valor do auxEnd inteiro na posição begin farray.write((char *) &auxEnd, sizeof(int)); farray.seekp(end * sizeof(int));// escreve o valor do auxBegin inteiro na posicao end farray.write((char *) &auxBegin, sizeof(int)); } #include 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));// lê o inteiro cuja posição é begin farray.read((char *) &auxBegin, sizeof(int)); farray.seekg(end * sizeof(int)); // lê o inteiro cuja posicao é end farray.read((char *) &auxEnd, sizeof(int)); farray.seekp(begin * sizeof(int));// escreve o valor do auxEnd inteiro na posição begin farray.write((char *) &auxEnd, sizeof(int)); farray.seekp(end * sizeof(int));// escreve o valor do auxBegin inteiro na posicao end farray.write((char *) &auxBegin, sizeof(int)); }

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Hierarquia iostream

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Acções de I/O directas sobre o terminal As primitivas de I/O comunicam directamente com o dispositivo físico (contrariamente às streams). Estas primitivas não constam nas bibliotecas standard do C++, no entanto são necessárias em algumas aplicações : –Recolha directa de caracteres sem edição de linha, ou seja, sem ser necessário aguardar a actuação da tecla ou para que o carácter fique disponível. –Recolha de caracteres com ou sem eco no ecrã. –Obter informação do teclado acerca da existência ou não de caracteres já disponíveis para recolha, permitindo realizar outras operações enquanto os caracteres não estejam disponíveis. Em PCs as declarações das acções directas sobre o terminal (consola) estão disponíveis no ficheiro

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados int getch( ) #include void main() { unsigned char ch; // unsigned para codigo > 127 do { cout << "\nPrima uma tecla (terminar '*')" << endl; ch = (unsigned char)getch(); // Testar se o primeiro código é de acção. O primeiro // código 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 != '*' ); } #include void main() { unsigned char ch; // unsigned para codigo > 127 do { cout << "\nPrima uma tecla (terminar '*')" << endl; ch = (unsigned char)getch(); // Testar se o primeiro código é de acção. O primeiro // código 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 != '*' ); } Detecção de teclas de acção Função getch() Recolhe caracteres do teclado sem a actuação da tecla e sem eco Devolve o código da tecla premida As teclas de acção (F1 a F12, Insert, Home, , , , , etc.), geram dois códigos: 1º: Sem significado ( 0, 224, etc). 2º: Código específico da tecla. Para recolher informação sobre estas teclas é necessário evocar a função por duas vezes.

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Função getche() Idêntica à função getch(), só que faz eco do caracter premido. #include void main() { int ch; do { cout << "Prima uma tecla alfanumerica - " << flush; ch = getche(); cout << "\nTecla com o codigo ASCII " << ch << endl; } while ( ch != '*' ); } #include void main() { int ch; do { cout << "Prima uma tecla alfanumerica - " << flush; ch = getche(); cout << "\nTecla com o codigo ASCII " << ch << endl; } while ( ch != '*' ); } getche( ) Ler teclas e escrever o correspondente código.

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Função putch() putch(char ch) Coloca directamente na consola o caracter cujo código é ch. #include #include void main() { char ch; do{ putch( toupper( ch = (char) getch() ) ); if (ch == '\r') putch('\n'); } while (ch != '*'); } Ler teclas e ecoar em maiúsculas.

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Função kbhit() Int kbhit ( ) Testa se uma tecla foi ou não actuada. #include #include #include void main(){ do { while( ! kbhit() ) putch('.'); getch(); //Consumir carácter de paragem. cout << "\nQuer continuar (S/N)? " << flush; //Recolher 'S' ou 'N'. } while( toupper(getch()) == 'S' ); } #include #include #include void main(){ do { while( ! kbhit() ) putch('.'); getch(); //Consumir carácter de paragem. cout << "\nQuer continuar (S/N)? " << flush; //Recolher 'S' ou 'N'. } while( toupper(getch()) == 'S' ); } Faz uma espera activa, escrevendo caracteres ‘.’ enquanto não for premida uma tecla.

Programação em C++ Pimenta Rodrigues Pedro Pereira Manuela Sousa Entrada e saída de dados Manipulação de strings O ficheiro dispõe da declaração dos protótipos das funções de manipulação de strings. int strlen(char *str); –Recebe uma string como parâmetro e devolve a sua dimensão. 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 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 ocorrência de str1 em str. Devolve um apontador para a 1ª ocorrência de str1 em str, ou NULL caso não exista. char *strchr( const char *str,int c); –Procura a ocorrência do caracter c str. Devolve um apontador para a 1ª ocorrência c em str, ou NULL caso não exista.