PDA

Visualizza la versione completa : [C++] Assegnare a variabili i valori presi dalle righe di un file di testo


freetom
25-01-2012, 14:44
Avrei la necessità senza ricorrere al "token" di prelevare nella maniera più pratica possibile 5 valori separati da virgola posti all'ultima enne riga di un file txt e assegnarli a 5 rispettivi variabili.

Più dettagliatamente...

1,2,3,4,5
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------
---------- (ultima estrazione)


In questo caso la 24°esima ultima estrazione è composta da valori 1,2,3,4,5 tutti separati da "," io vorrei chiedere tramite cin il valore di riga voluto (es 24 per ultima 24° riga)
e poi assengnare i 5 valori della 24° riga a cinque variabili

per avere ad esempio:

primo:1
secondo:2
terzo:3
quarto:4
quinto:5

Tutto questo non ricorrendo a token... se possibile...
Per adesso i cinque valori li ottengo inserendoli a mano... mediante richiesta by cin.

Grazie agli/alle esperti/e

:ciauz:

alka
25-01-2012, 14:46
Sorvolando sul titolo davvero appropriato, che poi correggerò, hai provato a scrivere del codice? hai fatto una ricerca preventiva? se sì, cosa non ha funzionato?

freetom
25-01-2012, 14:49
Ma appunto mi chiedevo se fossero possibili altre soluzioni "più pulite"

Grazie per la rapidità d'intervento...

:ciauz:

shodan
25-01-2012, 15:00
Se il numero di caratteri è variabile (ci sono anche numeri a due cifre) acquisisci il numero di riga, effettui un ciclo tramite un while acquisici la linea tramite una getline(cin,std::string), dai in pasto la std::string a un istringstream e estrai i valori con la sequenza:
>> int >> char >> int etc.

altrimenti il file si può considerare a campi fissi e puoi posizionarti direttamente alla riga che vuoi calcolando l'offset dalla fine del file e usando seekg. Ricavi la stringa e usi lo istringstream.

Altri modi non ne vedo dato che i file di testo non sono adatti a ricerche random.

freetom
25-01-2012, 15:08
Originariamente inviato da shodan
Se il numero di caratteri è variabile (ci sono anche numeri a due cifre) acquisisci il numero di riga, effettui un ciclo tramite un while acquisici la linea tramite una getline(cin,std::string), dai in pasto la std::string a un istringstream e estrai i valori con la sequenza:
>> int >> char >> int etc.

altrimenti il file si può considerare a campi fissi e puoi posizionarti direttamente alla riga che vuoi calcolando l'offset dalla fine del file e usando seekg. Ricavi la stringa e usi lo istringstream.

Altri modi non ne vedo dato che i file di testo non sono adatti a ricerche random.

Il passo che al momento mi risulterebbe più "oscuro" è l'ultimo:

e estrai i valori con la sequenza:
>> int >> char >> int etc.

Me lo spiegheresti con un es.? Oppure indicarmi un link con un esempio relativo?

Grazie!

:ciauz:

shodan
25-01-2012, 15:16
Hai cinque variabili int e quattro char no?


int a,b,c,d,e;
char comma;

istringstream iss(line);
iss >> a >> comma >> b >> comma >> c >> comma etc.


In a,b,c... ti ritrovi i numeri
in comma la virgola.

In teoria potresti farlo pure con lo ifstream ma se sbagli qualcosa rischi di invalidarlo.
Meglio usare un buffer e agire su quello.

freetom
25-01-2012, 16:06
Originariamente inviato da shodan
Hai cinque variabili int e quattro char no?


int a,b,c,d,e;
char comma;

istringstream iss(line);
iss >> a >> comma >> b >> comma >> c >> comma etc.


In a,b,c... ti ritrovi i numeri
in comma la virgola.

In teoria potresti farlo pure con lo ifstream ma se sbagli qualcosa rischi di invalidarlo.
Meglio usare un buffer e agire su quello.

Intanto grazie 1000

:ciauz:

freetom
26-01-2012, 09:45
Per adesso avrei provato a riaddattare parzialmente un codice che riesce egregiamente a estrapolare ogni numero per ruota partendo dal file storico.txt in questo modo:




cout << "Numero per l'ultima estrazione di partenza voluta?:";
cin >> numeroestrazionedipartenza;


ifstream fin;
fin.open("ESTRAZIONI-BA-CA-FI-GE-MI-NA-PA-RM-TO-VE-RN.txt");


string s;
bool isOk = false;
int cnt = 0;

while(!fin.eof())
{
fin >> s;

if(isOk)
{
if(cnt<4)
{
cout << s << ",";
cnt++;
}
else if(cnt<5)
{
cout << s;
cnt++;
}
else
{
cout << "" << endl;
cnt=0;
isOk=false;
}
}

if(sei posizionato sulla riga voluta [numeroestrazionedipartenza]) isOk=true;
}



Però come vedi non so cosa mettere nella parte if dove c'era un controllo sul nome delle ruote del tipo if (s=="BA" || s=="CA" ) ecc... affinchè tutto parta dal numero di ultima estrazione voluta...

Io adesso qui dovrei mettere il numero di riga voluto per iniziare la raccolta dei 5 valori per ruota...

Così facendo credo che mi estrapolerebbe tutti i 5 valori per ogni ruota che potrei raccogliere (ma al momento ignoro come... in 55 variabili distinte essendo 11 le ruote da analizzare)

Grazie infinite se puoi aiutarmi a "tappare" i buchi di questo codice.

Una piccola aggiunta descrittiva:

il file ESTRAZIONI-BA-CA-FI-GE-MI-NA-PA-RM-TO-VE-RN.txt è così strutturato:

numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero
numero,numero,numero,numero,numero

ecc...

e dovrei riuscire ad estrapolare i 5 numeri per ogni riga secondo blocchi di 11 righe per volta appunto... (partendo da quella di bari ma che vedo a occhio... quando inserisco il valore con cin)

avendo ad esempio:
x bari
valore1 = numero
valore2 = numero
valore3 = numero
valore4 = numero
valore5 = numero
x cagliari
valore6 = numero
valore7 = numero
valore8 = numero
valore9 = numero
valroe10 = numero
ecc...
fino a...
xa nazionale
valore50 = numero
valore51 = numero
valore52 = numero
valore53 = numero
valore54 = numero
valore55 = numero


:ciauz:

shodan
26-01-2012, 14:39
Secondo me hai tutti gli elementi e le conoscenze per elaborare e parserizzare il file.
Tra l'altro non vedo la necessità di complicarsi la vita tenendo un unico file con tutte le ruote ed estrazioni invece di avere un singolo file per ruota con le varie estrazioni.

1) Ti semplifica la vita
2) per aggiornare una ruota ti basterebbe aprire il file corrispondente e aggiornarlo.

A ogni modo ti dò una hint sul codice che hai proposto:
sebbene fin.eof() sia teoricamente corretto, in pratica è meglio fare:



while(getline(fin,s))
{


altrimenti l'ultima riga e ripetuta.

freetom
26-01-2012, 14:47
Originariamente inviato da shodan
Secondo me hai tutti gli elementi e le conoscenze per elaborare e parserizzare il file.
Tra l'altro non vedo la necessità di complicarsi la vita tenendo un unico file con tutte le ruote ed estrazioni invece di avere un singolo file per ruota con le varie estrazioni.

1) Ti semplifica la vita
2) per aggiornare una ruota ti basterebbe aprire il file corrispondente e aggiornarlo.

A ogni modo ti dò una hint sul codice che hai proposto:
sebbene fin.eof() sia teoricamente corretto, in pratica è meglio fare:



while(getline(fin,s))
{


altrimenti l'ultima riga e ripetuta.

Grazie shodan per l'ottimizzazione per evitare il doppio risultato finale (molto utile!!!) però mi daresti anche il modo di modificare l'if in modo che il cursore si riposizioni all'inizio della enne ultima riga voluta impostata manualmente una volta con il valore preso tramite cin?

Grazie infinite!

:ciauz:

Loading