Página principal   Módulos   Lista de namespaces   Hierarquia de classes   Lista de componentes   Lista de ficheiros   Membros do namespace   Componentes   Declarações   Paginas relacionadas  

Utilitários

Módulo correspondente ao ficheiro Slang/util.H. Mais...

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


Descrição detalhada

Módulo correspondente ao ficheiro Slang/util.H.

Contém utilitários variados.


Documentação da função

std::istream & Slang::operator>> ( std::istream & entrada,
Ignora const & ignora )
 

Operador de extracção para os manipuladores de ignorar caracteres.

É usado com os manipuladores pré-definidos il e ill.


Documentação da variável

Ignora const Slang::il
 

Manipulador que ignora todos os caracteres até ao próximo fim-de-linha ('\n').

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 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?)

Definido na linha 81 do ficheiro util.H.

Ignora const Slang::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.

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:
  1. Se a extracção tiver sucesso, não garante que o valor lido é não-negativo.
  2. Se a extracção não tiver sucesso, o canal cin fica com uma condição de erro, o que faz com que todas as extracções subsequentes falhem.
É 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(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ã.

Veja também:
il

Definido na linha 153 do ficheiro util.H.


Gerado em Mon May 14 17:22:14 2001 para Slang++ por doxygen1.2.6 escrito por Dimitri van Heesch, © 1997-2001