Newsgroup: it.comp.lang.c++
Titolo: leggere file di testo

Salve devo leggere un file di testo e prendere un po' di numeri da lì.
Ho letto del sorgente simile ma mi mancano un po' di dettagli.
farei una classe con due metodi, un costruttore e un metodo parse tipo
(preso da un sorgente, non roba mia):
int ISpaceConfig::Parse()
{
  if (!CFG_File.Open( NomeFile, CFile::modeRead, &e ))
 {
  Inizializzato=false;
  return -1;
 }
 DimFile=CFG_File.GetLength();
 char* buffer=new char[DimFile];
 CFG_File.Read(buffer,DimFile);
 int i=0, nn=0;
 CString pval;
poi inizierei coi cicli for per scorrere il testo e mettere i valori su
array o matrici. Mi consigliereste di farlo passandoli per riferimento?
Problemi:
supponiamo che io debba leggere valori separati da ; o da tabulazione. Come
risolvereste il fatto che possano essere numeri ad una, due cifre, con uno,
due decimali ecc, es:
3.4;13;87.24
ecc... Avreste magari link o esempi esemplificativi?
Come fare poi coi commenti, tipo righe che iniziano con //.
Perdonate la banalità delle questioni
Ringraziamenti anticipati

 Come fare poi coi commenti, tipo righe che iniziano con //.
non ho capito la domanda! :)
Ciao, Pasko

 3.4;13;87.24
Questa cosa la puoi fare in modo assolutamente banale in C con
una bella fscanf (q.v.)
double a,b,c;
FILE il_file;
il_file = fopen("testo.txt","rt");
fscanf(il_file,"%lf;%lf;%lf",&a,&b,&c);
fclose(il_file);
probabilmente c'e' qualcosa in vero C++ di simile, ma io
non mi intendo molto dello std del c++ ...
di sicuro non c'e' bisogno che vai a fare lo scan dei
singoli numeri, perche' presumo che il formato
di questo file tu lo conosca.
ciao,
g.

 non ho capito la domanda! :)
vorrei fargli saltare le righe di commento che iniziano con //.
Devo mettere una serie di if per dirgli: se la riga inizia con // allora vai
avanti finchè non trovi un /n
Ma devo farlo continuamente perchè il file è lunghetto e potrebbero esserci
commenti ovunque
Grazie, ciao

 di questo file tu lo conosca.
Dirò di più, il formato posso farmelo come voglio, ma vorrei libertà per
inserire i commenti.
Grazie, ciao

 Eppoi, salterebbe le righe di commento tipo quelle che iniziano con //?
allora ti rispondo da c-ista (visto che non ti risponde nessun c++-ista
verace)
apri il file e leggi una riga alla volta in un buffer dimensionato
opportunamente con l'istruzione fgets (che appunto legge
una riga alla volta fino al \n).
dopo di che controlli i primi 2 bytes e se sono diversi da //
allora fai una sscanf (che e' come la fscanf solo che scanna una
stringa c-old-style (cioe' un array di char terminato da uno 0).
Il tutto si puo' fare in una manciata di righe....
prendi in mano il manuale o google e studiati bene il funzionamento
di fgets e sscanf. Oppure aspetta un po' e presumo qualcuno ti
rispondera' con gli equivalenti in C++ della standard library.
ciao.
g.

 commenti ovunque
Nella mia ignoranza... io farei esattamente come hai detto tu! :)
Ma vedo che c'è già chi ti ha risposto meglio di me! :)
Ciao, Pasko

 Ringraziamenti anticipati
HTH
--
Andrea Spadaccini - Catania (Italy)
Mail: _
lupin85...@libero.it
 - ICQ#: 91528290
. - Too much is not enough - .

             }
ma tu volevi le conversioni.
Bé, puoi fare così.
(includendo <sstream>)
double str2double(string s) {
    ostringstream oss;
    double d;
    oss << s;
    oss >> d;
    return d;
}
Questa funzione dal nome autoesplicativo converte un oggetto std::string in
un double. quindi puoi mettere nell'if
    double d = str2double(temp);
    temp.clear();
Se devi gestire più valori, ti raccomanderei di utilizzare uno dei
containers della STL. Ad esempio dichiari uno std::vector<double> all'inizio
e poi metti nel codice, oltre alla conversione, un
    v_double.push_back(d);
così, alla fine del parsing, avrai un bel vector di double su cui poter
lavorare.
Ti consiglio comunque di dare un'occhiata alle std::string, agli stream ed
alla STL.


Ciao
innanzittutto ti ringrazio moltissimo.
Io vorrei mettere i valori su vari array di double. Secondo te è conveniente
metterli temporaneamente in una coda eppoi estrarmeli pian piano? So
esattamente come è fatto il file di testo, quindi non avrei ambiguità di
sorta.
Altrimenti dovrei fare vari parse per riempire i vari vettori, che sono 8,
di dimensione diversa.
Che ne dici?
Grazie ancora, ciao

 }
Ehm, dammi pure del cialtrone :) , ma non capisco esattamente cosa faccia
questa funzione.
Ciao

 
[...]
Scusa ma, dato che effettui operazioni sia di input che di output su `oss', 
non dovresti dichiararlo `stringstream'?
Oppure far cosě:
//...
ostringstream oss(s);
double d;
oss >> d;
//...
Saluti
-- 
Per l'e-mail rimuovere la frase in maiuscolo e gli underscore.
Worship Him! 666

 non dovresti dichiararlo `stringstream'?
Esattamente. E' stato un lapsus ;P
--
Andrea Spadaccini - Catania (Italy)
Mail: _
lupin85...@libero.it
 - ICQ#: 91528290
"We must not allow other people's limited perceptions to define us." -
Virginia Satir

 ma non capisco esattamente cosa faccia questa funzione.
semplicemente:
prende come parametro una stringa.
riversa la stringa in uno stringstream
utilizza l'operatore di estrazione da stream per ficcare il
contenuto dello stream (cioé la stringa) nel double, occupandosi
delle conversioni in automatico.
alla fine torna il tuo bel double :)
--
Andrea Spadaccini - Catania (Italy)
Mail: _
lupin85...@libero.it
 - ICQ#: 91528290
. - Knowledge is not what you can remember, but what you cannot forget - .

 Che ne dici?
Credo che la soluzione dipenda solo da come viene comodo a *te*, perché a
livello di memoria lo spazio occupato è irrisorio.
Personalmente, conoscendo la struttura, metterei tutto in un solo vettore e
poi prenderei i dati man mano.
Più che un array, ti consiglio di utilizzare uno std::vector, o qualche
altro
container STL.
--
Andrea Spadaccini - Catania (Italy)
Mail: _
lupin85...@libero.it
 - ICQ#: 91528290


>     return d;
