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(). |
1.3-rc1