PDA

View Full Version : [C++/Qt] Classe equivalente a stringstream??


vendettaaaaa
06-03-2012, 19:46
Ciao,
sto programmando una calcolatrice scientifica che effettua il parsing dell'input, in Qt.
Al momento leggo l'espressione utilizzando una stringstream, ma vorrei passare all'equivalente Qt di questa classe, per poter utilizzare QChar, QString eccetera per maneggiare i caratteri unicode (tipo radice quadrata e superscript 2 e 3).

Ho provato ad usare QTextStream ma non ho capito bene se è questa la classe giusta, perchè rispetto a stringstream mancano alcune funzioni:
in.eof() c'è ed è in.atEnd(),
ma in.get() non sembra avere un equivalente,
inoltre in.putback() mi serve parecchio ma anche questa funzione non c'è in QTextStream.
Infine, la conversione a bool non è definita e non posso scrivere:
while (in >> ch)
Qualcuno mi sa indirizzare? Ho cercato nella documentazione ma questo è uno di quei momenti di sconforto, in cui mi rendo conto che sarà completa ma proprio per questo vastissima e non riesco a trovare facilmente informazioni!
Grazie :D

vendettaaaaa
09-03-2012, 02:19
Possibile che nessuno nella rete, perlomeno per quel che sono riuscito a trovare, non si sia mai posto il problema di come manipolare delle stringstream usando le Qt??? :eek:

tomminno
09-03-2012, 10:20
Ma che problema hai ad utilizzare direttamente stringstream?

[Kendall]
09-03-2012, 10:42
Un parser è una unità totalmente logica, secondo me ti conviene svincolarla dalle librerie qt e andare direttamente di librerie standard e stringstream. E' più semplice, diretto e portabile (utilizzando invece le qt la portabilità va a farsi benedire).

Ps: ho notato ora che il tuo dubbio deriva dal voler utilizzare stringhe unicode. In realtà questo ti è permesso anche dalla libreria standard. Ricorda che la libreria standard fornisce tipi stringa diversi, in base alla "tipologia di caratteri" utilizzata:

char --> string
wchar_t -->wstring

(questi ultimi solo per c++11)
char16_t --> u16string
char32_t --> u32string

Ricorda, nel caso, di utilizzare i relativi metodi per manipolare le stringhe, quindi, per esempio, se usi una wstring non usare strncpy, ma wcscpy.

vendettaaaaa
09-03-2012, 13:39
Uhm...grazie dell'input!
Ho letto un po' in giro e non ho ben capito se wchar_t tiene gli unicode a 16 bit o solo fino a 8...proverò, nel caso dovrò restringere l'elenco dei caratteri matematici che implemento.

[Kendall]
09-03-2012, 15:18
Uhm...grazie dell'input!
Ho letto un po' in giro e non ho ben capito se wchar_t tiene gli unicode a 16 bit o solo fino a 8...proverò, nel caso dovrò restringere l'elenco dei caratteri matematici che implemento.

La dimensione di un wchar_t dipende dall'implementazione, ma solitamente è di 16bit. Ricordati che quando inserisci una stringa di caratteri wchar_t (o un singolo carattere) devi inserire il prefisso L prima della stringa:


const wstring stringawide = L"pippo";
wcout << stringawide;


(puoi notare anche l'uso del wcout anzichè il normale cout che non riesce ad operare con questo tipo).
Similarmente per le stringhe/caratteri di char16_t e char32_t si usa rispettivamente u e U

vendettaaaaa
09-03-2012, 15:43
Ok mi ci metto più tardi stasera, vediamo che riesco a fare, al momento ho una QString per l'espressione che l'utente vede e una per il parser con caratteri char, tipo:
²√9+81⁻¹ per l'utente e
$r9+81_£ per il parser.
Utilizzarne una sola accorcerebbe di molto il codice, sarebbe più elegante e semplificherebbe un pelo lo spostamento del cursore per modificare/eliminare parti dell'espressione.
Per ora, grazie!! :D