Newsgroup: it.comp.lang.c++
Titolo: Parser di parole

Chiedo un aiuto a quanti sappiano darmelo!!
Non sono molto bravo col C++ e devo fare un parser che legga newgroup.
In pratica prende un file, scarta l'header (cioè si posiziona dopo la
prima riga vuota) dopodichè deve trovare tutte le parole. Deve
scartare numeri, segni di punteggiatura e simboli: solo lettere
maiuscole e minuscole. Ciascuna parola deve essere caricata in un
vector di stringhe, vector che sarà dato in pasto ad un software già
pronto.
Ora io ho realizzato la prima parte fino a scartare l'header, sto
avendo qualche difficoltà con la seconda (la realizzazione del
vector).
Grazie a tutti coloro che vorranno darmi un aiuto!!
Ciao
Arsenio Lupin
(togliere gli spazie e NOSPAM per rispondere in privato)

 vector).
E vuoi che te lo facciamo noi? Inventandocelo dal nulla? Mammamia! Sei
ottimista forte, eh? Dove sei arrivato?
--- bye

ottimista forte, eh? Dove sei arrivato?
Guarda che ho chiesto un aiuto a chi voglia darmelo. Se non ti va puoi
evitare di prendermi per i fondelli e non rispondere. Forse sei forte
in programmazione, ma in educazione...vabbč, lasciamo perdere, tanto č
fiato sprecato!


La risposta (forse un po' scortese) che ti e' stata data precedentemente 
e' dovuta al fatto che qui e' considerata buona educazione il fatto di 
postare del codice gia' fatto se si chiede aiuto, altrimenti e' come 
dire "scrivetemi il codice" (tipo studente che deve fare i compiti a 
casa ma non ne ha voglia).
Per quanto riguarda il vector: non per essere cattivi, ma e' C++ proprio 
di base - non serve essere "bravi" col C++ per saperlo, ma principianti 
basta... Cmq, direi che il metodo push_back potrebbe fare al caso tuo.
-- 
Mattia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311   - email: 
mbel...@cs.unibo.it
IRC: BluShine   - site(s): 
http://cs.unibo.it/~mbellett
Linux registered user 299762 @ Linux registered machine 213003

vector di stringhe
spero che tu non abbia problemi a caricare le parole in un vector di
stringhe!! :) 
Ciao,
Zeppe

basta... Cmq, direi che il metodo push_back potrebbe fare al caso tuo.
Sicuramente mi sono spiegato male...so come si inseriscono degli
elementi in un vector. Il mio problema è come tralasciare dal file,
una volta tolto l'header, solamente le parole tralasciando la
punteggiatura, gli spazi, le tabulazioni, i ritorni carrello, etc.
Ciao e grazie


stringhe!! :) 
 No. il problema non è questo. Sicuramente nel mio post non mi sono
spiegato bene.
grazie ancora e ciao


= 97) && (singlechar <= 122)))
    {
      word[i] = singlechar;
      i++;
      input_file.get(singlechar);
    }
    if (i > 0)
    {
      word[i] = '\0';
      vector_element = word;
      final_parsed.push_back(vector_element);
    }
  }
  return final_parsed;
} 
Il problema, quando vado ad esaminare il vector<string> in output, che
sul file di prova (un file di testo normale)  mi da prima una decina
di righe vuote e poi il testo vero e proprio, parola per parola,
scartando gli spazi, i punti, insomma, tutto come lo volevo.
Come faccio, se vi va di dirmelo, ad eliminare quelli elementi vuoti
del vector? Da che dipendono?
Ciao e grazie


Io sono sempre cattivo :-) E' che mi disegnano così... :-)
Il problema è che la tua richiesta è incompleta... Non specifichi niente!
Ti faccio alcuni esempi... Come li apri i files? Con l'fstream o con la
fopen? Usi le stringhe c (in realtà, usi gli array di char del C) o usi le
string del c++? Il file è già tutto in memoria/lo dobbiamo leggere nel pezzo
di codice che dovremmo scrivere? Come dobbiamo dividere le parole? Ti faccio
alcuni esempi
domanda incompleta (2 parole)
domanda, incompleta (2 parole, la virgola si scarta)
domanda,incompleta (senza spazio, 1 o due parole? E' la virgola un
separatore "acconcio"?)
domanda9incompleta (come consideriamo il 9? Come uno spazio, o lo ignoriamo
e basta?)
come consideriamo i fine riga? Li ignoriamo (quindi "domanda\nincompleta" =
"domandaincompleta"/li consideriamo fine parola (come uno spazio) = "domanda
incompleta")
Nel caso dobbiamo leggere il file riga per riga, è fattibile ignorare la
lunghezza di una riga? (non ci ritroveremo mai con righe da 64mb, vero? Se
mi dici che non lo sai, allora leggere riga per riga è grossolano per non
dire pericoloso, e dobbiamo quindi leggere a blocchi )
Lo sai che un vettore è una delle cose peggiori che potresti usare? Tu non
conosci di base il numero di parole, e quindi ogni tanto il vector dovrebbe
ingrandirsi (e quindi duplicarsi). Probabilmente dovresti usare qualcosa
tipo list/deque)
--- bye



Massimiliano,
devi perdonarmi per la mia risposta un pò brusca. Come avrai intuito
non sono un programmatore e il dover fare questo lavoro (in tempi
brevi) mi secca un pò. Ti ringrazio per questa tua ultima risposta che
mi aiuta a comprendere molti aspetti che prima non avevo considerato.
Non era comunque mia intenzione mancare di rispetto a nessuno o
delegare ad altri un compito che sto svolgendo io, nè tantomeno
infrangere la netiquette. Se ho dato questa impressione chiedo venia e
le prossime volte cercherò di postare con più accortezza.
Ciao


del vector? Da che dipendono?
Problema risolto!!
Grazie a tutti e ciao


       vector_element = word;
Mi spieghi perchè usi la word[256]? Oltre a imporre una limitazione
"stupida" al programma (limiti a 256 caratteri e non controlli quanti
caratteri hai già inserito), non sarebbe più semplice/lineare aggiungere
direttamente alla vector_element e poi, dopo averla push_back(ata)
ripulirla?
Occhio che, per come l'hai strutturato tu, le lettere accentate lui le
considera spazi! E invece di usare direttamente i numeri (65, 97...),
potresti provare a usare isalpha. Sta attento a passare a isalpha((unsigned
char)singlechar); (se no le lettere accentate gli stanno indigeste....
Problemi di segni).
Se poi dovessi decidere di migliorarlo, usare un buffer di memoria
temporaneo di un paio di kb (su piattaforme Intel/PowerPC 4096 bytes)
accellera parecchio (tu leggi in questo buffer un pezzo di file, e poi lo
elabori direttamente lì... Occhio che diventa un po' incasinato)).
--- bye

 o delegare ad altri un compito che sto svolgendo io
Il problema è che ogni tanto capita gente che ci vorrebbe affibbiare i SUOI
compitini per casa :-)
--- bye



Consigli preziosi!! Cercherò al più presto di metterli in pratica. 
Ti faccio sapere.
Grazie 1000.
Ciao


97) && (singlechar <= 122))))
ARGH!! Questo e' male!!! Usa isalpha()! (devi #includere <cctype>)
e poi al primo giro singlechar che cosa contiene?
Ciao,
Zeppe

e poi al primo giro singlechar che cosa contiene?
Al primo giro singlechar mi serve per scartare eventuali spazi o
caratteri "non graditi". Chi mi garantisce che il documento inizi con
testo.
Grazie a tutti per gli ottimi suggerimenti, implementati con profitto.
Ciao


testo.
Ok, io intendevo, dato il tuo codice:
vector<string> Parser::parsed_file()
{
  char singlechar;
  char word[256];
  string vector_element;
  vector<string> final_parsed(10);
  long int i;
  while (!input_file.eof())
  {
    if (!(((singlechar >= 65) && (singlechar <= 90)) | ((singlechar >=
97) && (singlechar <= 122))))
 
Ecco, come vedi nel flusso di esecuzione il primo controllo su
singlechar lo fai senza averlo inizializzato (non gli hai assegnato
esplicitamente un valore). Probabilmente tu vorresti che all'inizio
singlechar valesse un qualcosa che non sia una char, e per fare cio'
basta che lo inizializzi a zero.
Ciao,
Zeppe