Componentes | |
| class | Slang::Erro |
| Base de uma pequena hierarquia de classes representando excepções. Mais... | |
| class | Slang::ErroAoCarregar |
| Representa excepções de carregamento de objectos a partir de canais. Mais... | |
| class | Slang::ErroAoGuardar |
| Representa excepções ao guardar objectos usando canais. Mais... | |
| class | Slang::Ignora |
| Representa manipuladores de entrada que ignoram caracteres. Mais... | |
Manipuladores extra para std::istream | |
| Ignora const | il |
Manipulador que ignora todos os caracteres até ao próximo fim-de-linha ('\n'). Mais... | |
| Ignora const | ill |
Manipulador que ignora todos os caracteres até ao próximo fim-de-linha ('\n') mas primeiro limpa possíveis condições de erro do canal. Mais... | |
Funções | |
| std::istream& | operator>> (std::istream &entrada, Ignora const &ignora) |
| Operador de extracção para os manipuladores de ignorar caracteres. Mais... | |
Contém utilitários variados.
|
|
Operador de extracção para os manipuladores de ignorar caracteres. |
|
|
Manipulador que ignora todos os caracteres até ao próximo fim-de-linha ( O nome é uma abreviatura de "ignora linha". Exemplo de utilização
Se num ficheiro estiverem guardados em linhas consecutivas um inteiro e o nome completo de uma passoa, pode-se tentar ler estes valores como se segue (admite-se que
int numero;
entrada >> numero;
string nome;
getline(entrada, nome);
Esta solução não funciona, pois o operador de extracção do inteiro deixa o fim-de-linha no canal, o que leva getline() a ler uma cadeia vazia! A solução passa por ignorar todos os caracteres até ao fim-de-linha:
#include <Slang/util.H>
using namespace Slang;
...
int numero;
entrada >> numero >> il;
string nome;
getline(entrada, nome);
Neste caso o ficheiro de entrada até pode possuir um comentário depois do inteiro, que será ignorado. Por exemplo, o ficheiro poderia ser:
12345 Número do aluno
Xisto Ximenes
(Que se teria de fazer para que se pudessem colocar comentários após o nome?)
|
|
|
Manipulador que ignora todos os caracteres até ao próximo fim-de-linha ( O nome é uma abreviatura de "ignora linha limpa". Exemplo de utilização Suponha que se pretende ler do teclado um inteiro que tem de ser não-negativo (o número de um aluno, por exemplo). A solução óbvia é:
cout << "Introduza um número não negativo: ";
int numero;
cin >> numero;
cout << "O número é: " << numero << endl;
Esta solução tem dois problemas:
int numero;
while(true) {
cout << "Introduza um número não negativo: ";
cin >> numero >> il;
if(numero >= 0)
break;
cout << "Tem de ser não negativo!" << endl;
}
cout << "O número é: " << numero << endl;
Note-se na utilização do manipulador il, que é usado para que a leitura seja orientada por linha.
Esta solução resolve o primeiro problema, mas não o segundo... A solução passa por verificar também se a extração teve sucesso. Caso não tenha tido sucesso é necessário limpar a condição de erro e ignorar toda a linha. Dessa forma o utilizador pode voltar a tentar introduzir um número:
int numero;
while(true) {
cout << "Introduza um número não negativo: ";
if(cin >> numero >> il && numero >= 0)
break;
if(cin)
cout << "Tem de ser não negativo!" << endl;
else {
cout << "Isso não é um número!" << endl;
// Ignora resto da linha limpando condição de erro.
cin >> ill;
}
}
cout << "O número é: " << numero << endl;
Idealmente esta solução seria encapsulada numa função que devolvesse o número e fosse parametrizada pela condição a verificar pelo valor (neste caso tem de ser não negativo) e pelas mensagens a escrever no ecrã.
|
1.2.6 escrito por Dimitri van Heesch,
© 1997-2001