Newsgroup: it.comp.lang.c++
Titolo: Come diavolo si fa ???

come si fa un input formattato con caratteri di separazione diversi dal
canonico  spazio ???
cioe' vorrei usare gli stream ma leggendo valori separati magari da ; o da .
senza fare giri strani usando i get e atoi ecc ...
cioe' vorrei ottenere lo stesso effetto della sscanf() o altri in cui puoi
indicare i caratteri di separazione da un valore all'altro ...
era solo per rimanere in C++ con gli stream seno' mi sa tanto che reinizio
ad usare tutto l'io di basso livello del c e mi levo un sacco di problemi
...
ciao

 
wrote:

Anch'io avevo un problema simile, ho ottenuto una risposta in un news in 
inglese, ti "riposto" la soluzione, anche se io non la uso perchè le mie 
conoscenze di C++ ancora non me la fanno capire del tutto... e non mi piace 
usare cose che non capisco del tutto, non vorrei ritrovarmi con 
comportamenti strani... ma forse tu puoi capirlo...
In poche parole ha ridefinito il separatore nel cin facendogli riconoscere 
come separatori "," e "\n"... ma io non capisco l'uso di tutti quei mask 
get_table locale() etc...
Ciao,
Checco.
---------------------------------------------------------------------------- 
--
#include <iostream>
#include <locale>
#include <algorithm>
  struct commactype: std::ctype<char>
{
   commactype(): std::ctype<char>(get_table()) {}
   static std::ctype_base::mask const* get_table()
   {
       static std::ctype_base::mask* rc = 0;
  if (rc == 0)
       {
          rc = new std::ctype_base::mask[std::ctype<char>::table_size];
          std::fill_n(rc, std::ctype<char>::table_size,
                      std::ctype_base::mask());
          rc[',']  = std::ctype_base::space;
          rc['\n'] = std::ctype_base::space;
       }
       return rc;
   }
};
 int main()
{
     std::string nome, cognome;
     int eta;
     std::cin.imbue(std::locale(std::locale(), new commactype));
     std::cin >> nome >> cognome >> eta;
     std::cout << "\nnome   : " << nome
               << "\ncognome: " << cognome
               << "\neta'   : " << eta << "\n";
  system("pause");
  return 0;
}
 ----------OUTPUT
Francesco,Colocci Vespucci,24
 nome   : Francesco
cognome: Colocci Vespucci
eta'   : 24
Premere un tasto per continuare...

 get_table locale() etc...
ma si dai ... e' una soluzione assurda ... cioe' per tanto cosi' mi leggo
una stringa e ci strippo via i char cambiandoli in spazi ... cioe' ma guarda
se per riuscire a fare le cose che in c ci metti 3 secondi a scriverli ed ad
eseguirli in C++ si sono andati ad inpelagare con locale e retest su tutti i
char letti ... cioe' pesantezza alla N !!!
no no se questa e' la soluzione preferisco gli anti estetici e non ad
oggetti sscanf() e similia !!!
da pazzi ... !!!
ciao

 oggetti sscanf() e similia !!!
Perchč non fare l'input una riga per volta usando std::string?
Poi tokenizzare il tutto come diavolo ti pare?
Puoi scriverti la tua classe generale per fare lo scanning dell'input
utilizzando la boost::tokenizer o la piů semplice StringTokenizer (quella di
Java) che ho tradotto su questo NG qualche mese fa.
-- 
Domenico Testa - Studente

 Java) che ho tradotto su questo NG qualche mese fa.
e poi ho convertito una stringa c in string, l'ho tokenizzata e devo cmq
richiamare ancora atoi ecc se voglio convertirla in forma numerica ...
sinceramente al confronto dell'uso di una sscanf ci perdo 30 volte il tempo
no ??? (per ora mantengo la sscanf W-C++ veramente astruso alle volte ...)
questa cosa dovrebbe essere inserita in un gioco 3d e non posso sprecare
troppe risorse ... io speravo per lasciare il codice il piu' possibile ad
oggetti di poter usare uno stream string dicendo di usare come fine lettura
il punto invece dello spazio ed usare i canonici operatori>> ma le soluzioni
che mi avete proposto sono troppo dispersive e spendaccione ... quella dei
locale era una mattonata, la tua e' un po' meglio ma porta via ancora troppi
passaggi per avere il risultato voluto ...
cmq grazie a tutti dei suggerimenti e dei consigli vene sono grato
ciao