|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 1736
|
[C++] Aiuto a fare il parsing di una linea
Ciao a tutti,
in un programma che uso, leggo un file di testo in cui per ogni riga vi sono dei parametri non separati ma inseriti nella stringa che di volta in volta leggo. Il file di testo è composto da file che dovrei aprire, ma prima dovrei ricavarne i parametri fondamentali dal loro stesso nome. Mi è venuto in mente di leggere la riga con fscanf, conoscete metodi migliori ??? Esempio di uso: lista file: p_a1_b2.5_c3.txt q_a2_b1.5_c4.txt r_a3_b0.3_c5.txt s_a4_b3.5_c6.txt e pensavo di leggerla così: char par0[1]; int par1=0,par3=0; float par2=0.0; fscanf(file,"%c_a%d_b_%f_c%d.txt",par0,&par1,&par2,&par3) avete consigli migliori ??? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Non bastava "char par0;"?
Se il testo è formattato così rigorosamente direi che può anche andare bene, ma non ho mai provato a farlo. Solo, dovresti controllare il valore di ritorno di fscanf() dopo ogni chiamata per verificare che la lettura sia stata (probabilmente) corretta. Altrimenti, puoi fare un piccolo parser manuale, non è difficilissimo. Ci vuole solo una maggiore dose di pazienza...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Probabilmente ti conviene leggere una riga alla volta (cosi' hai gia' il nome del file completo) e poi estrarre da questa i parametri che ti interessano usando la strtok.
__________________
In God we trust; all others bring data |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 1736
|
strtok ?????
e sarebbe ? |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
strtok è il migliore amico del memory leak
Visto che sei in C++ leggi una stringa alla volta dal fstream con getline. Poi usi un istringstream e fai il parsing come più ti aggrada, ad esempio usando getline con il delimitatore e scartando i caratteri che non servono con ignore. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 1736
|
In effetti volevo capire bene come fare il parsing....
apprezzo il tuo aiuto cionci, ma se ti fosse possibile, potresti indicarmi un link o libro dove sia spiegato più in dettaglio come fare parsing? Grazie mille a tutti comunque... |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non è che ci sia un libro, si tratta semplicemente di usare le funzionalità che ti mette a disposizione la libreria standard. Anche definire questo parsing significa solo ingigantire il problema.
Per ogni metodo o classe ti ho linkato la spiegazione e c'è anche un esempio. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 1736
|
Grazie !!!!
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Non mi risulti alllochi memoria. Il problema e' che usa variabili statiche, quindi non e' thread safe.
__________________
In God we trust; all others bring data |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Cmq il suggerimento migliore e' quello che hai dato, riguardo all'uso degli stream. Sicuramente!
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 1736
|
Ciao !!!
piccolo problema, la situazione è la seguente: Esempio di uso: lista file: p_a1.0_b2.5_c3.5.txt q_a2.0_b1.5_c4.2.txt r_a3.0_b0.3_c5.4.txt s_a4.0_b3.5_c6.txt e pensavo di leggerla così: char par0[1]; float par1=0,par3=0; float par2=0.0; fscanf(file,"%c_a%f_b_%f_c%f.txt",par0,&par1,&par2,&par3) ma il programma si pianta a leggere l'ultima linea del file di esempio in quanto non riconosce il 6.txt ed invece vorrebbe un 6.0.txt come posso ovviare il problema ? ho 3000 file, non posso rinominarli per ora.... a meno di non usare qualche script o regular expression che però non son capace ad usare... |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2004
Messaggi: 1736
|
Dici di usare getchar?
Ho poca fantasia su cosa fare |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
A questo punto, potresti fare una fscanf() leggendo dei %d invece di %f, qualcosa del tipo Codice:
int result = fscanf(file,"%c_a%d.%d_b_%d.%d_c%d.%d.txt",
par0,&par1,&par2,&par3,&par4,&par5,&par6);
- se il nome e' del tipo r_a3.0_b0.3_c5.4.txt, otterrai result = 7 - se il nome e' del tipo s_a4.0_b3.5_c6.txt, otterrai result = 6 e non utilizzerai par6 perche' non contiene nulla di significativo. NOTA: non l'ho provato, ho solo letto il manuale della fscanf()!
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:16.




















