Newsgroup: it.comp.lang.c++
Titolo: input da stream

Ciao,
avrei bisogno di leggere un input di questo genere:
[    4    5.6    -34.89     -12.99e-10    0.99999   0    0    9  ]
insomma, una lista di numeri in virgola mobile compresa tra parentesi
quadre.
Non so a priori quanti numeri siano compresi nella lista.
Mi chiedevo cosa succedeva leggendo dallo stream di input quando provo a
fare:
float a;
cin >> a;
e invece di un numero in virgola mobile mi trovo un "]".
Viene impostato il bit di fail che posso testare con cin.fail (), ma la
parentesi quadra e' estratta dallo stream? Se resetto i flag di errore e
provo a leggere un carattere o una string mi trovo la "]"? Esiste un modo
per pushare indietro nello stream di input qualcosa che non sia un carattere
(per i caratteri lo so che si puo' fare, ma si puo' fare anche per i float,
gli int, le string e in generale per i tipi di dati creati dall'utente?)?.
Grazie mille, Morusaka.

 ha scritto nel messaggio
news:WNG%c.1087$6b4....@twister1.libero.it...


 tipi di dati creati dall'utente?)?.
Con un streambuf filtrant chi implemente un stack. Con i miei streambuf
filtrant, può fare un Extractor così:
    class Extractor : public GB_SimpleExtractor
    {
    public:
        int                 extract( std::streambuf& src )
        {
            int                 result = EOF ;
            if ( myStack.empty() ) {
                result = src.sbumpc() ;
            } else {
                result = myStack.back() ;
                myStack.pop_back() ;
            }
            return result ;
        }
        void                push_back( std::string const& text )
        {
            std::copy( text.rbegin(), text.rend(),
                       std::back_inserter( myStack ) ) ;
        }
    private:
        std::vector< char > myStack ;
    } ;
Allora basta :
    GB_FilteringIstream< Extractor >
                        src( std::cin ) ;
    src.rdbuf()->extractor().push_back( "ciao" ) ;
    //  ...
--
James Kanze           GABI Software         
http://www.gabi-soft.fr
Conseils en informatique orientée objet/
                   Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, 
+33 (0)1 30 23 00 34

 funzione della libreria per farlo...
    std::cin >> std::ws ;
esstrata i bianchi.
    std::cin.peek()
permette de vedere un carattero senza estratterlo dello flusso.
Se vuoi fare più complicato, c'è sempre std::find_if su un
istreambuf_iterator. Si leggere une linea, pui boost::regex, allora, le
possibilità son infinite.



Devo leggere un file ".rib". Avevo provato con boost::regex, ma anche se
andava bene per piccoli parsing, andando ad applicare la stessa regex a file
un po' piu' lunghi, spesso mi si bloccava il programma. Cosi', visto che la
sequenza dei dati che posso trovare e' abbastanza predicibile, ho pensato di
evitare totalmente le regex e usare invece la lettura di dati dallo stream.
Mi sarebbe piaciuto rispedire indietro intere strutture di dati, ma se
proprio bisogna passare dalle funzioni che manipolano caratteri (tipo peek,
come appunto mi hai scritto) faro' cosi'.
Grazie e buon lavoro,
Morusaka.

 la lettura di dati dallo stream.
Certo che se non hai bisogna... La soluzione la più semplice è sempre al
megliore.



Mmm.... non avevo visto.. in ogni caso avevo pescato l'input su una stringa.
Ciao, Morusaka.