Ficheiros | |
file | ignoradores.C |
Ficheiro de implementação do módulo ignoradores. | |
file | ignoradores.H |
Ficheiro de interface do módulo ignoradores. | |
file | ignoradores_impl.H |
Ficheiro auxiliar de implementação do módulo ignoradores. | |
Componentes | |
class | Ignorador |
Representa manipuladores de canais de entrada (istream) que descartam caracteres. Mais... | |
Manipuladores extra para std::istream | |
Ignorador const | il ('\n') |
Manipulador que descarta todos os caracteres até ao próximo fim-de-linha ('\n' ). | |
Ignorador const | ill ('\n', true) |
Manipulador que descarta todos os caracteres até ao próximo fim-de-linha ('\n' ), mas primeiro limpa possíveis condições de erro do canal. | |
Funções | |
std::istream & | operator>> (std::istream &entrada, Ignorador const &ignorador) |
Operador de extracção para os manipuladores de ignorar/descartar caracteres. |
Contém manipuladores para ignorar caracteres de um canal.
|
Operador de extracção para os manipuladores de ignorar/descartar caracteres. É usado com os manipuladores pré-definidos il e ill.
Definido na linha 11 do ficheiro ignoradores.C. |
|
Manipulador que descarta todos os caracteres até ao próximo fim-de-linha ( O nome é uma abreviatura de "ignora linha". 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 #entrada é um canal ligado ao ficheiro):
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?) Referenciado por Utilitarios::Data::Data(). |
|
Manipulador que descarta todos os caracteres até ao próximo fim-de-linha ( O nome é uma abreviatura de "ignora linha limpa". 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:
É importante perceber que, neste caso, se assume que ao teclado está um humano, que reconhece e espera poder corrigir os seus erros! Assim, a solução passa por escrever um ciclo:
int numero; while(true) { cout << "Introduza um número não negativo: "; cin >> numero >> il; if(0 <= numero) 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: "; cin >> numero >> il; if(cin.good() and numero >= 0) break; if(cin.good()) 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ã.
Referenciado por Utilitarios::Data::actual(). |