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ã.
|