Página principal   Módulos   Lista de namespaces   Hierarquia de classes   Lista de componentes   Lista de ficheiros   Membros do namespace   Componentes membro   Ficheiros membro   Páginas relacionadas  

Ignoradores

Módulo correspondente ao ficheiro Utilitarios/ignoradores.H. Mais...


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.


Descrição detalhada

Módulo correspondente ao ficheiro Utilitarios/ignoradores.H.

Contém manipuladores para ignorar caracteres de um canal.


Documentação das funções

istream & Utilitarios::operator>> std::istream &    entrada,
Ignorador const &    ignorador
 

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

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

Precondição:
V.
Poscondição:
O canal #entrada foi esvaziado dos caracteres disponíveis até ao primeiro caractere ignorador.terminador, tendo as suas possíveis condições de erro sido limpas no caso de ignorador.deve_limpar_o_canal ser verdadeira.

Definido na linha 11 do ficheiro ignoradores.C.

Ignorador const il '\n'   
 

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

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

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.

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:

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

Veja também:
il

Referenciado por Utilitarios::Data::actual().


Gerado em Tue Dec 3 15:19:36 2002 para Pacotes por doxygen1.3-rc1