View Full Version : [c++] estrarre dati da file di testo
moritzplatz
01-01-2009, 14:16
ciao a tutti!
vorrei scrivere un programma in c++ che, dato un file di testo, ne estragga dei dati!
in particolare io vorrei dargi un testo come questo:
Meidad Sagron (209070894)
Israel 19 anni e 25 giorni, Prossimo compleanno: 29-03-2009
debole di forma, accettabile in resistenza
Una persona simpatica, tranquilla e onesta.
È disastroso in esperienza e debole in carisma.
Proprietario: fantani (dal 25-12-2008)
Indice Totale Skill (TSI): 1 000
Ingaggio: 636 €/settimana incluso 20% Bonus
Ammonizioni: 0
Infortuni: Nessuno
Attendere prego... Attendere prego...
Skill attuali
Resistenza: accettabile Parate: disastroso
Regia: debole Passaggi: scarso
Cross: scarso Difesa: buono
Attacco: debole Calci piazzati: tremendo
e prendere da questo alcuni valori che ho evidenziato.
riempendo con questi valori degli int e una stringa (per il nome) in modo da poterli utilizzare poi all'interno del programma!
che mi dite?
da dove posso iniziare?
grazie mille a tutti e, dimenticavo, buon anno! :) :)
wizard1993
01-01-2009, 14:41
per input dei file in c++
http://www.cplusplus.com/reference/iostream/fstream/
moritzplatz
01-01-2009, 14:52
grazie!
dunque dovrei fare un programma del tipo:
#include<iostream.h>
#include<fstream.h>
int main(){
ifstream in("test.ppp");
if(!in){
cout<<"Impossibile leggere il file"<<endl;
return 1;
}
else cout<<"Il file può essere letto!"<<endl;
in.close();
return 0;
}
però dove lo devo mettere il file?
e poi perchè nell'estensione .ppp?
e poi, soprattutto, come faccio a operarci sopra?
wizard1993
01-01-2009, 15:01
ora mi sfugge da dove hai preso quell'esempio
la prima cosa che mi viene da scrivere è
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream in("file.ext");
if(in.is_open()){
cout<<"file is open";
}
else{
cerr<<"error opening file";
exit(-1);
}
string what="";
while(in>>what){
cout<<what<<endl;
}
}
non c'è bisogno di chiudere esplicitamente il file, il distruttore lo fa per te
il file deve essere nella cartella dell'eseguibile.
l'estensione è arbitraria
sopra una basica funzione di lettura
moritzplatz
01-01-2009, 15:13
lo ho preso vedendo un pò in guiro e modificandolo (prima non c'era l'else)
comunque ho sostituito l'estensione "ext" con "txt" ma non dovrebber cambiare nulla....
ho messo il file nella stessa cartella del file exe eppure mi dice sempre "error opening file"
come mai?
che cosa è una basica funzione di lettura?
moritzplatz
01-01-2009, 15:16
lo ho preso vedendo un pò in guiro e modificandolo (prima non c'era l'else)
comunque ho sostituito l'estensione "ext" con "txt" ma non dovrebber cambiare nulla....
ho messo il file nella stessa cartella del file exe eppure mi dice sempre "error opening file"
come mai?
che cosa è una basica funzione di lettura?
ok sono riuscito a farlo leggere :)
andava messo nella cartella dove c'è il .cpp!
comunque ora me lo visualizza nella finestra dos....
qualcosa per tagliare le parti inutili?, come inizio....
wizard1993
01-01-2009, 15:33
allora, se vuoi il mio consiglio per ora che sei agli inizi propendi verso un file in cui ci sia un elemento per riga, poi ti consiglio di guardarti le stupende funzioni membro della classe string
http://www.cplusplus.com/reference/string/string/
e l'utilissimo strtok
http://www.cplusplus.com/reference/clibrary/cstring/strtok.html
moritzplatz
01-01-2009, 15:35
ok grazie!
però qui si propone il problema fondamentale:
non ho una stringa!
wizard1993
01-01-2009, 15:45
ok grazie!
però qui si propone il problema fondamentale:
non ho una stringa!
nel mio esempio c'è scritto come fare nel pezzo
string what;
while(in>>what){
//do some
}
moritzplatz
01-01-2009, 15:51
ah ok grazie...
dunque quella che visualizza è già una stringa!
quindi la posso già dividere in parola per parola.....
in questo modo mi si faciliterebbe la cosa?
mi spiego:
se ho una stringa divisa in tutte parole è più facile scegliere quelle che mi servono?
(la dividerei con strtok, quella che mi hai postato tu!)
wizard1993
01-01-2009, 16:14
dipende da cosa ci devi fare,
ad esempio, prendendo da un file come quello che hai postato, presupporrei che sotto ci sia una classe che contenga tutte le proprietà della persona, e in quel caso dividere il testo in parole, potrebbe essere utile per sapere quando comincia una proprietà tipo "Cross:" perchè poi sapresti che la parola dopo andrebbe ad essere quella relativa alle qualità del cross e così via
moritzplatz
01-01-2009, 16:24
hai ragione!
potrei fare una classe"giocatore"....non ci avevo pensato.....
ora inizio!
poi la posto così mi aiutate a riempirla!
Usa getline:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream in("file.ext");
if(in.is_open()){
cout<<"file is open";
}
else{
cerr<<"error opening file";
exit(-1);
}
string buffer;
int stipendio;
in percentuale;
//lettura della linea "Ingaggio: 636 €/settimana incluso 20% Bonus"
getline(in, buffer, ' ');
in >> stipendio;
//suppongo che il formato della linea sia standard quindi che ci siano le stess lettere
getline(in, buffer, 'o');
in >> percentuale;
}
moritzplatz
01-01-2009, 18:44
grazie!
allora due cose:
la prima:
quell' in prima di percentuale è un errore di battitura o è così? perchè poi in lo userai.....
la seconda:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
exit(-1);
}
string buffer;
int stipendio;
int percentuale;
//lettura della linea "Ingaggio: 636 €/settimana incluso 20% Bonus"
getline(in, buffer, ' ');
in >> stipendio;
//suppongo che il formato della linea sia standard quindi che ci siano le stess lettere
getline(in, buffer, 'o');
in >> percentuale;
cout<<stipendio<<endl;
}
ho provato a mettere quel cout finale per capire se avesse davvero preso lo stipendio e invece mi da: 4441221.....
che vuol dire?
Ovviamente legge solo quella riga, nel file dovresti avere solo quella.
in è un errore di battitura ;)
moritzplatz
01-01-2009, 18:52
grande!
ho provato e funziona in questo modo!!!!
allor ami è venuta una idea per leggere tutti i dati.....
non potrei dividere il programma in righe creando ogni volta un file txt che ne contenga solo una e poi leggere i dati da una riga alla volta?
e per il fatto di dover sostituire buono con 7, tremendo con 3 eccetere che potrei fare?
grazie ancora !!!!!:) :)
Non serve !!! Ti basta leggere riga per riga e fare le dovute operazioni con quella riga.
Ad esempio sulla prima leggerai fino allo spazio il nome, fino alla parentesi il cognome, poi leggerai il numero e poi termini la lettura della riga con:
getline(in, buffer);
senza delimitatore.
Poi la seconda e la terza non ti interessano, quindi ti basta leggerle e non farne niente con
getline(in, buffer);
e per il fatto di dover sostituire buono con 7, tremendo con 3 eccetere che potrei fare?
Un map, leggi la stringa che identifica il valore dal file e con quella indicizzi il map. Il map è di questo tipo:
map<string, int> scalaValori;
ovviamente lo devi riempire con i valori:
scalaValori["tremendo"] = 3;
E poi recuperi il valore con scalaValori[stringaLettaDalFile]
moritzplatz
01-01-2009, 19:13
è la funzione del delimitatore che non ho capito.....
ad esempio, nell'esempio che hai fatto tu, ' ' cosa delimita?
forse perchè è sia a destra che a sinistra del numero che è lo stipendio?
però se così fosse percentuale non dovrebbe essere 20 ma 20 % B perchè la o questa parte delimita :mc: :mc: :mc: non capisco :cry: :cry: :cry:
comunque grazie ancora perchè secondo me una volta che ho capito sta cosa è la svolta!
moritzplatz
01-01-2009, 19:26
:muro: :muro: :muro:
ho provato.....
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
exit(-1);
}
string buffer;
int stipendio;
int percentuale;
int id;
char nome [50];
char cognome [50];
//lettura della linea "Ingaggio: 636 €/settimana incluso 20% Bonus"
getline(in, buffer, ' ');
in >> nome;
//suppongo che il formato della linea sia standard quindi che ci siano le stess lettere
getline(in, buffer, '(');
in >> cognome;
getline(in,buffer, ')');
in >> id;
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
}
invece di
Meidad
Sagron
209070894
lui mi dice:
Sagron
209070894)
1
come se fosse sfalsato....
wizard1993
01-01-2009, 23:55
ora sarò io che abituato alle comodità del java ho perso il lume della ragione, ma un codice tipo questo non va bene?
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
exit(-1);
}
char text [128];
in.getline(text, ' ');
char* nome=strtok(text," ()");
char *cognome=strtok(0," ()");
int id=atoi(strtok(0," ()"));
cout<<nome<<endl<<cognome<<endl<<id;
}
è da una vita che non ritocco il c++, e vorrei saepre se è abitudine insana usare questo codice
moritzplatz: non funziona perché hai saltato fino allo spazio con la prima getline...
wizard1993: strtok secondo me ha poco senso con le facility che ci sono nel C++ per leggere le stringhe dai file...la getline si ferma al primo spazio ed ovviamente il cognome non te lo legge ;)
Per fare parsing più complessi di questi (nel caso in cui la struttura del file non sia fissa) può essere il caso di leggere una intera linea, passarla ad un istringstream e poi manipolare lo stream sempre con getline e con l'operatore >> (che gestisce anche la conversione dei tipi).
moritzplatz
02-01-2009, 10:46
moritzplatz: non funziona perché hai saltato fino allo spazio con la prima getline...
allora:
ho messo come delimitatore lo spazio, quindi lui dovrebbe prendere tutto quello fino allo spazio escluso, no?
poi col secondo dovrebbe prendere tutto quello fino alla parentesi esclusa e col terzo idem......
dove sbaglio?
La getline in questo caso serve per "saltare" i caratteri fino ad un delimitatore (delimitatore incluso). Questi caratteri letti vengono messi in buffer, ma a te non servono. In caso dovessi leggere una stringa ad esempio puoi usare getline per leggerla fino ad un dato delimitatore.
Comunque usa string invece di usare i vettori di char. A meno che non tu non abbia restrizioni particolari è sempre meglio dei vettori di char.
Ad esempio:
string nome;
string cognome;
string buffer;
int id;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in, buffer); //salta fino alla fine della riga
moritzplatz
02-01-2009, 14:59
grazie mille!
ora ho capito come funzionano!
sono andato molto avanti!
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
exit(-1);
}
string buffer;
int id;
int TSI;
int stipendio;
int percentuale;
string nome;
string cognome;
string forma;
string resistenza;
string parate;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in,buffer);//ignora la seconda riga
getline(in,buffer);//ignora la terza riga
getline(in,forma,' ');//legge la forma
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,resistenza,' ');//legge la resistenza
getline(in,buffer);
getline(in,buffer); //ignoro tre righe
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,':');
in >> TSI; //dovrebbe essere tutto attaccato il numero.....non essendolo....problemi!
getline(in,buffer,' ');
in >> stipendio;
getline(in,buffer,'o');
in >> percentuale;
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,parate,' ');
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
cout<<forma<<endl;
cout<<resistenza<<endl;
cout<<TSI<<endl;
cout<<stipendio;
if (percentuale == 20) cout<<" incluso bonus"<<endl;
else cout<<endl;
cout<<parate<<endl;
/*
scalaValori["inesistente"] = 0;
scalaValori["disastroso"] = 1;
scalaValori["tremendo"] = 2;
scalaValori["scarso"] = 3;
scalaValori["debole"] = 4;
scalaValori["insufficiente"] = 5;
scalaValori["accettabile"] = 6;
scalaValori["buono"] = 7;
scalaValori["eccellente"] = 8;
scalaValori["formidabile"] = 9;
scalaValori["straordinario"] = 10;
scalaValori["splendido"] = 11;
scalaValori["magnifico"] = 12;
scalaValori["fuoriclasse"] = 13;
scalaValori["sovrannaturale"]= 14;
scalaValori["titanico"] = 15;
scalaValori["extraterrestre"]= 16;
scalaValori["mitico"] = 17;
scalaValori["magico"] = 18;
scalaValori["utopico"] = 19;
scalaValori["divino"] = 20;
*/
}
a parte la questione del map che non ho capito, mi sono trovato di fronte a due problemi tecnici:
1) quando lo runno dandogli questo file:
Miguel Ángel Moreira (84195314) [1 ammonizione]
Argentina 28 anni e 93 giorni, Prossimo compleanno: 21-01-2009
insufficiente di forma, buono in resistenza
Una persona gradevole, equilibrata e retta.
È debole in esperienza e scarso in carisma.
Proprietario: fantani (dal 27-11-2008)
Indice Totale Skill (TSI): 3 090
Ingaggio: 1 044 €/settimana incluso 20% Bonus
Ammonizioni: 1
Infortuni: Nessuno
Attendere prego... Attendere prego...
Skill attuali
Resistenza: buono Parate: disastroso
Regia: scarso Passaggi: insufficiente
Cross: eccellente Difesa: tremendo
Attacco: eccellente Calci piazzati: scarso
lui mi stampa:
Miguel
Angel
l'id
la forma
la resistenza
e il TSI, essendo di 4 cifre, mi stampa solo la prima
stessa cosa per lo stipendio.....il fatto è che la prima è separata dalla seconda cifra.....essendo int non so come risolvere questo inghippo!
2)
vabbene tralasciando tsi e stipendio poi lui mi stampa:
disastroso (il giusto valore di parate) e poi, alla riga successiva, mi stampa: "regia:" che non c'entra nulla e non è neppure su quella riga..... perchè?
grazie mille ancora e scusa per il tempo che ti sto rubando :)
Il problema della separazione delle cifre te lo devi risolvere manualmente.
Ad esempio per TSI sai che il numero arriva fino a fine riga. Quindi puoi leggere come testo il valore fino a a fine riga.
string buffer;
getline(in, buffer);
A questo punto buffer contiene la stringa "3 090", la classe string (http://www.cplusplus.com/reference/string/string/) contiene vari metodi per ricercare un carattere, a questo punto cerchi lo spazio con find ed una volta individuata la posizione lo elimini con erase.
A questo punto passi la stringa a un istringstream (http://www.cplusplus.com/reference/iostream/istringstream/) e usi l'operatore >> (come per leggere dal file) per recuperare l'intero.
Stessa cosa per lo stipendio: leggi con getline fino al '€', elimini l'ultimo carattere e poi prosegui come sopra.
Per il map (http://www.cplusplus.com/reference/stl/map/) la questione è semplice, inseriti quei valori, dopo per recuperare l'intero basterà indicizzare il map tramite il valore letto da file:
scalaValori[regia]
ritornerà il valore intero corrispondente.
moritzplatz
02-01-2009, 16:04
Il problema della separazione delle cifre te lo devi risolvere manualmente.
Ad esempio per TSI sai che il numero arriva fino a fine riga. Quindi puoi leggere come testo il valore fino a a fine riga.
string buffer;
getline(in, buffer);
A questo punto buffer contiene la stringa "3 090", la classe string (http://www.cplusplus.com/reference/string/string/) contiene vari metodi per ricercare un carattere, a questo punto cerchi lo spazio con find ed una volta individuata la posizione lo elimini con erase.
A questo punto passi la stringa a un istringstream (http://www.cplusplus.com/reference/iostream/istringstream/) e usi l'operatore >> (come per leggere dal file) per recuperare l'intero.
Stessa cosa per lo stipendio: leggi con getline fino al '€', elimini l'ultimo carattere e poi prosegui come sopra.
Per il map (http://www.cplusplus.com/reference/stl/map/) la questione è semplice, inseriti quei valori, dopo per recuperare l'intero basterà indicizzare il map tramite il valore letto da file:
scalaValori[regia]
ritornerà il valore intero corrispondente.
grazie mille!
e per il problema numero 2?
comunque devo fare così in pratica:
creo una stringa chiamata tsi....
ci inserisco il valore 3 090 o quello che è.-....
poi faccio:
find (tsi, ' ') e poi faccio erase(' ')
per cercare uso questa: string::find_first_of
ma magari ce ne è una che cerca e toglie insieme :)
find ti restituisce la posizione...c'è scritto come funziona e cosa ti restituisce in caso non trovi alcuna occorrenza.
erase prende la posizione. Non esiste un metodo che fa tutto in un solo passaggio.
Per il problema 2 non c'è il codice, quindi non posso capire perché non ti funzioni.
moritzplatz
02-01-2009, 16:16
il codice c'è!
lo ho postato 4 post sopra....
è come se lui vedesse l'inizio della riga sotto nella riga sopra.....
moritzplatz
02-01-2009, 16:26
ok mi sono studiato meglio quei link che mi hai dato.
questo è quello che ho fatto per provare a togliere quello spazio, facendomi dare una stringa senza spazio (non considero la possibilità di due spazi perchè non tratterò giocatori del genere :) )
purtroppo quando gli faccios tampare la stringa modificata non esce nulla :(
string tsi;
string tsiok;
size_t trovato;
getline(in,tsi);
trovato=tsi.find_first_of(' ');
tsi.erase(trovato)=tsiok
questa è la parte di programma
non lo posto tutto perchè è troppo lungo!
Vincenzo1968
02-01-2009, 17:00
È d'uopo, in casi come questo, utilizzare un bell'automa a stati finiti.
:bimbo:
moritzplatz
02-01-2009, 17:02
È d'uopo, in casi come questo, utilizzare un bell'automa a stati finiti.
:bimbo:
io di solito uso quello di mealy te?
È d'uopo, in casi come questo, utilizzare un bell'automa a stati finiti.
:bimbo:
Imho no, qui proprio no, visto che non è un parsing...infatti il formato del file è fisso.
il codice c'è!
lo ho postato 4 post sopra....
è come se lui vedesse l'inizio della riga sotto nella riga sopra.....
Aspetta, avevo capito male...devi usare getline(in,parate);
Non ti devi fermare allo spazio, ma alla fine della riga.
ok mi sono studiato meglio quei link che mi hai dato.
questo è quello che ho fatto per provare a togliere quello spazio, facendomi dare una stringa senza spazio (non considero la possibilità di due spazi perchè non tratterò giocatori del genere :) )
purtroppo quando gli faccios tampare la stringa modificata non esce nulla :(
string tsi;
string tsiok;
size_t trovato;
getline(in,tsi);
trovato=tsi.find_first_of(' ');
tsi.erase(trovato)=tsiok
questa è la parte di programma
non lo posto tutto perchè è troppo lungo!
tsi = tsi.erase(trovato);
istringstream temp(tsi);
int valoreInteroTsi;
temp >> valoreInteroTsi;
Vincenzo1968
02-01-2009, 17:17
Imho no, qui proprio no, visto che non è un parsing...infatti il formato del file è fisso.
Proprio perchè il formato è fisso conviene usare un automa. ;)
x moritzplatz: mealy non lo conosco. Di solito uso l'algoritmo descritto nel bel libro di Hopccroft, Motwani e Ullman:
Automi, linguaggi e calcolabilità (http://www.ibs.it/code/9788871921549/hopcroft-john-e/automi-linguaggi-calcolabilita.html)
:bimbo:
Proprio perchè il formato è fisso conviene usare un automa. ;)
Mah...mi sembra che sia come sparare ad un passerotto con un cannone.
Gli automi a stati finiti di Mealy sono quelli in cui il valore dell'uscita dipende sia dal valore degli ingressi che dal valore dello stato attuale. Quelli di Moore sono quelli in cui l'uscita dipende esclusivamente dallo stato.
moritzplatz
02-01-2009, 17:21
error: variable `std::istringstream temp' has initializer but incomplete type|
mi dice così....
error: variable `std::istringstream temp' has initializer but incomplete type|
mi dice così....
Devi includere <sstream>
Vincenzo1968
02-01-2009, 17:35
Mah...mi sembra che sia come sparare ad un passerotto con un cannone.
Minchia! Sta diventando un tormentone questa frase. Me la sento ripetere ogni volta che propongo un automa come soluzione :D
Io gli automi li utilizzo dappertutto(e me ne sono creato uno che, la mattina, mi porta la colazione a letto :O )
Gli automi a stati finiti di Mealy sono quelli in cui il valore dell'uscita dipende sia dal valore degli ingressi che dal valore dello stato attuale. Quelli di Moore sono quelli in cui l'uscita dipende esclusivamente dallo stato.
Grazie mille ;)
Comunque, automa o no, il file andrebbe strutturato meglio. Per esempio, nel caso di cognomi o nomi contenenti spazi, come si fa a separare il nome dal cognome?
Esempio:
Giovanni Paolo Serbelloni Mazzanti Vien dal Mare.
:bimbo:
moritzplatz
02-01-2009, 17:38
edit!
Comunque, automa o no, il file andrebbe strutturato meglio. Per esempio, nel caso di cognomi o nomi contenenti spazi, come si fa a separare il nome dal cognome?
Esempio:
Giovanni Paolo Serbelloni Mazzanti Vien dal Mare.
Per quelli si dovrà ingegnare un minimo, non è che gli si può fare tutto. ;) Lì nemmeno un automa ci può venire in aiuto, perché non sai dove inzia il cognome.
In ogni caso basta leggere fino al primo spazio il nome e fino alla tonda il cognome, poi basta rimuovere la tonda ;) Tre righe.
moritzplatz
02-01-2009, 17:40
Minchia! Sta diventando un tormentone questa frase. Me la sento ripetere ogni volta che propongo un automa come soluzione :D
Io gli automi li utilizzo dappertutto(e me ne sono creato uno che, la mattina, mi porta la colazione a letto :O )
Grazie mille ;)
Comunque, automa o no, il file andrebbe strutturato meglio. Per esempio, nel caso di cognomi o nomi contenenti spazi, come si fa a separare il nome dal cognome?
Esempio:
Giovanni Paolo Serbelloni Mazzanti Vien dal Mare.
:bimbo:
mi sono accorto di questo problema.....
lo ho risolto ignorandolo :)
tanto ogni giocatore ha un id che lo contraddistingue....
il nome serve solo ad aiutare la mia memoria a capire quale giocatore sia (non ricordo gli id a memoria :)) e dunque le prime due parole sono sufficienti a questo scopo!
moritzplatz
02-01-2009, 17:44
ok lo ho incluso:
questo è il codice
getline(in,tsi);
cout<<tsi<<endl; //lo metto per esser certo che ho preso la stringa giusta
trovato=tsi.find_first_of(' ');
tsi = tsi.erase(trovato);
int valoreInteroTsi;
istringstream temp(tsi);
temp >> valoreInteroTsi;
eppure non mi restituisce il numero giosto ma un altro di molte più cifre.....
il mio dubbio è che quella stringa inizi con molti spazi e quindi lui elimina solo il primo.....anche in questo caso però non si capisce perchè poi, quando stampo valoreinterotsi mi restituisce quello strano numero.....
La stringa non deve inziare con spazi. In ogni caso la erase non funziona così, hi sbagliato a scriverla anche io, basta questo:
tsi.erase(trovato, 1);
bisogna passargli anche il numero di caratteri da eliminare.
Per evitare il numero gli spazi iniziali ingegnati un po'...ad esempio con rfind ;)
moritzplatz
02-01-2009, 17:57
ho pensato, dato che tutte ste stringhe iniziano con lo stesso numero di spazi, posso trovare una funzione che elimini i primi n caratteri!
ho cercato e ho trovato questa: tsi& erase ( size_t pos = 0, size_t n = 2 );
solo che mi da un errore....
l'idea è buona?
non potrebbe essere che essendo una tabulazione e uno spazio lui non me la trovi la tabulazione?
Attenzione che quello è il prototipo della funzione, devi utilizzare i parametri attuali...
tsi.erase(0,2);
La tabulazione è formata da un unico carattere.
Vincenzo1968
02-01-2009, 17:59
mi sono accorto di questo problema.....
lo ho risolto ignorandolo :)
tanto ogni giocatore ha un id che lo contraddistingue....
il nome serve solo ad aiutare la mia memoria a capire quale giocatore sia (non ricordo gli id a memoria :)) e dunque le prime due parole sono sufficienti a questo scopo!
Allora non sarebbe meglio avere, nella classe, un solo campo che rappresenti nome e cognome?:
class Giocatore
{
int id;
string NomeCognome;
...
...
};
moritzplatz
02-01-2009, 18:07
forse sarebbe meglio.....
ma io sono ancora nella fase di riuscire a tirare fuori da quel file tutti i dati che mi servono!
poi penserò a organizzarli al meglio e a costruirci su una classe!
comunque hai ragione, ora lo modifico, anche perchè mi risparmio una stringa!
moritzplatz
02-01-2009, 18:12
yuhu!!!
ce la abbiamo fatta....
ecco il codice :
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
tsi = tsi.erase(trovato,1);
int valoreInteroTsi;
istringstream temp(tsi);
temp >> valoreInteroTsi;
ora vado avanti con la lettura del file!
comunque l'enciclopedia era sbagliata perchè al posto di
tsi.erase(0,2);
metteva
tsi& erase ( size_t pos = 0, size_t n = 2 );
comunque l'enciclopedia era sbagliata perchè al posto di
tsi.erase(0,2);
metteva
tsi& erase ( size_t pos = 0, size_t n = 2 );
No ;)
string& erase ( size_t pos = 0, size_t n = npos );
è la dichiarazione del metodo...cioè come il metodo è dichiarato all'interno della classe string. Per utilizzarlo si traduce in:
nome_string.erase(1, 2);
ad esempio.
moritzplatz
02-01-2009, 19:36
ah ok...
comunque il programma è arrivato a buon punto!
:) :) :)
la parte in cui devo immagazzinare dati è completata!
ora ho tutte le skill e il nome immagazzinati in stringhe e tsi,stipendio e id immagazzinati in interi!
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
exit(-1);
}
string buffer;
int id;
int TSI;
int STIPENDIO;
int percentuale;
int valoreInteroTsi;
int valoreInteroStipendio;
// map <string,int> scalaValori;
string nome;
string cognome;
string forma;
string resistenza;
string parate;
string tsi;
string stipendio;
string regia;
string passaggi;
string cross;
string difesa;
string attacco;
string calcipiazzati;
size_t trovato;
size_t trovato1;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in,buffer);//ignora la seconda riga
getline(in,buffer);//ignora la terza riga
getline(in,forma,' ');//legge la forma
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,resistenza,' ');//legge la resistenza
getline(in,buffer);
getline(in,buffer); //ignoro tre righe
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,':');
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
tsi = tsi.erase(trovato,1);
istringstream temp(tsi);
temp >> valoreInteroTsi;
getline(in,buffer,' ');
getline(in,stipendio,'€');
stipendio.erase(0,1);
trovato1=stipendio.find_first_of(' ');
stipendio= stipendio.erase(trovato1,1);
istringstream temp1(stipendio);
temp1 >> valoreInteroStipendio;
getline(in,buffer,'o');
in >> percentuale;
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,parate);
parate=parate.erase(0,1);
getline(in,buffer,' ');
getline(in,regia,' ');
regia=regia.erase(0,1);
getline(in,buffer,' ');
getline(in,passaggi);
passaggi= passaggi.erase(0,1);
getline(in,buffer,' ');
getline(in,cross,' ');
cross = cross.erase(0,1);
getline(in,buffer,' ');
getline(in,difesa);
difesa = difesa.erase(0,1);
getline(in,buffer,' ');
getline(in,attacco,' ');
attacco=attacco.erase(0,1);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,calcipiazzati);
calcipiazzati=calcipiazzati.erase(0,1);
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
cout<<"Forma: "<<forma<<endl;
cout<<"Resistenza: "<<resistenza<<endl;
cout<<"Tsi: "<<valoreInteroTsi<<endl;
cout<<"Stipendio: "<<stipendio;
if (percentuale == 20) cout<<" incluso bonus"<<endl; //c'è o no il bonus??
else cout<<endl;
cout<<parate<<endl;
cout<<regia<<endl;
cout<<passaggi<<endl;
cout<<cross<<endl;
cout<<difesa<<endl;
cout<<attacco<<endl;
cout<<calcipiazzati<<endl;
// cout<<scalaValori[parate]<<endl;
/*sclaaValori["inesistente"] = 0;
scalaValori["disastroso"] = 1;
scalaValori["tremendo"] = 2;
scalaValori["scarso"] = 3;
scalaValori["debole"] = 4;
scalaValori["insufficiente"] = 5;
scalaValori["accettabile"] = 6;
scalaValori["buono"] = 7;
scalaValori["eccellente"] = 8;
scalaValori["formidabile"] = 9;
scalaValori["straordinario"] = 10;
scalaValori["splendido"] = 11;
scalaValori["magnifico"] = 12;
scalaValori["fuoriclasse"] = 13;
scalaValori["sovrannaturale"]= 14;
scalaValori["titanico"] = 15;
scalaValori["extraterrestre"]= 16;
scalaValori["mitico"] = 17;
scalaValori["magico"] = 18;
scalaValori["utopico"] = 19;
scalaValori["divino"] = 20;
*/
}
questo è il programma....
alla fine (in commento) ho messo anche la scala valori per il map!
non ho capito però come inserirle.....
Devi creare un map da string a intero.
http://www.yolinux.com/TUTORIALS/CppStlMultiMap.html
http://en.wikipedia.org/wiki/Map_(C%2B%2B_container)
moritzplatz
02-01-2009, 20:43
ci son riuscito grazie mille!!!!
:) :) :) :)
ora vedrò cosa posso farci con un giocatore in un programma!
moritzplatz
02-01-2009, 20:51
ora vorrei fare una classe mettendoci dentro tutte le cose che son riuscito a tirare fuori dal file di testo....
che dici ne vale la pena?
tutta la parte fatta fino ad ora la posso mettere nel costruttore :)
moritzplatz
02-01-2009, 22:15
cavoli ho avuto un problema!
provando a modificare il file di imput con alcuni giocatori mi da questo messaggio quando provo a runnarlo.....
this application has requested the runtime to terminate it in an unusual way.
please contact the application's support team for more information.
process returned 3 (3X0)
strano....non mi era mai capitato!
wizard1993
02-01-2009, 22:55
sai usare un debugger? se si è il caso di usarlo altrimenti è il caso tu impari, fa molto comodo te lo consiglio per il futuro. piazza vari cout con messaggi ti inidicazione per capire dove è l'errore, e poi posta il codice che tenti di correggere
per le classi guarda qui
http://programmazione.html.it/guide/lezione/1193/concetti-base-della-programmazione-ad-oggetti/
nelle pagine successive è scritto come dichiare ed usare le classi e gli oggetti
moritzplatz
02-01-2009, 23:03
non lo ho mai usato!
so della sua esistenza e anche del suo utilizzo.....
il codice è questo:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
return -1;
}
map<string,int> scalaValori;
scalaValori["inesistente"] = 0;
scalaValori["disastroso"] = 1;
scalaValori["tremendo"] = 2;
scalaValori["scarso"] = 3;
scalaValori["debole"] = 4;
scalaValori["insufficiente"] = 5;
scalaValori["accettabile"] = 6;
scalaValori["buono"] = 7;
scalaValori["eccellente"] = 8;
scalaValori["formidabile"] = 9;
scalaValori["straordinario"] = 10;
scalaValori["splendido"] = 11;
scalaValori["magnifico"] = 12;
scalaValori["fuoriclasse"] = 13;
scalaValori["sovrannaturale"]= 14;
scalaValori["titanico"] = 15;
scalaValori["extraterrestre"]= 16;
scalaValori["mitico"] = 17;
scalaValori["magico"] = 18;
scalaValori["utopico"] = 19;
scalaValori["divino"] = 20;
string buffer;
int id;
int TSI;
int STIPENDIO;
int percentuale;
int valoreInteroTsi;
int valoreInteroStipendio;
int intcross;
int intregia;
int intforma;
int intresistenza;
int intparate;
int intpassaggi;
int intdifesa;
int intattacco;
int intcalcipiazzati;
string nome;
string cognome;
string forma;
string resistenza;
string parate;
string tsi;
string stipendio;
string regia;
string passaggi;
string cross;
string difesa;
string attacco;
string calcipiazzati;
size_t trovato;
size_t trovato1;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in,buffer,' ');//ignora la seconda riga
getline(in,buffer);//ignora la terza riga
getline(in,forma,' ');//legge la forma
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,resistenza,' ');//legge la resistenza
getline(in,buffer);
getline(in,buffer); //ignoro tre righe
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,':');
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
tsi = tsi.erase(trovato,1);
istringstream temp(tsi);
temp >> valoreInteroTsi;
getline(in,buffer,' ');
getline(in,stipendio,'€');
stipendio.erase(0,1);
trovato1=stipendio.find_first_of(' ');
stipendio= stipendio.erase(trovato1,1);
istringstream temp1(stipendio);
temp1 >> valoreInteroStipendio;
getline(in,buffer,'o');
in >> percentuale;
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,parate);
parate=parate.erase(0,1);
getline(in,buffer,' ');
getline(in,regia,' ');
regia=regia.erase(0,1);
getline(in,buffer,' ');
getline(in,passaggi);
passaggi= passaggi.erase(0,1);
getline(in,buffer,' ');
getline(in,cross,' ');
cross = cross.erase(0,1);
getline(in,buffer,' ');
getline(in,difesa);
difesa = difesa.erase(0,1);
getline(in,buffer,' ');
getline(in,attacco,' ');
attacco=attacco.erase(0,1);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,calcipiazzati);
calcipiazzati=calcipiazzati.erase(0,1);
forma=forma.erase(0,1);
resistenza=resistenza.erase(0,0);
intcross=scalaValori[cross];
intdifesa=scalaValori[difesa];
intattacco=scalaValori[cross];
intcalcipiazzati=scalaValori[calcipiazzati];
intforma=scalaValori[forma];
intresistenza=scalaValori[resistenza];
intparate=scalaValori[parate];
intpassaggi=scalaValori[passaggi];
intregia=scalaValori[regia];
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
cout<<"Forma: "<<forma<<endl;
cout<<"Resistenza: "<<resistenza<<endl;
cout<<"Tsi: "<<valoreInteroTsi<<endl;
cout<<"Stipendio: "<<stipendio;
if (percentuale == 20) cout<<" incluso bonus"<<endl; //c'è o no il bonus??
else cout<<endl;
cout<<"Parate: "<<parate<<endl;
cout<<"Regia: "<<regia<<endl;
cout<<"Passaggi: "<<passaggi<<endl;
cout<<"Cross: "<<cross<<endl;
cout<<"Difesa: "<<difesa<<endl;
cout<<"Attacco: "<<attacco<<endl;
cout<<"Calci Piazzati: "<<calcipiazzati<<endl;
}
siccome è lungo e frastagliato pensavo di confrontare l'imput che funziona e quello che non funziona......
sono questi due:
Jarl Hvalsøe Schou (215521299)
Danmark 18 anni e 48 giorni, Prossimo compleanno: 07-03-2009
debole di forma, accettabile in resistenza
Una persona scontrosa, irascibile e disonesta.
È disastroso in esperienza e insufficiente in carisma.
Proprietario: fantani (dal 12-09-2008)
Indice Totale Skill (TSI): 800
Ingaggio: 396 €/settimana incluso 20% Bonus
Ammonizioni: 0
Infortuni: Nessuno
Specialità: Imprevedibile
Attendere prego... Attendere prego...
Skill attuali
Resistenza: accettabile Parate: disastroso
Regia: scarso Passaggi: insufficiente
Cross: scarso Difesa: buono
Attacco: debole Calci piazzati: disastroso
questo non funziona!
Cătălin-Ioan Manole (200205579)
România 20 anni e 15 giorni, Prossimo compleanno: 09-04-2009
accettabile di forma, buono in resistenza
Una persona gradevole, calma e onesta.
È disastroso in esperienza e insufficiente in carisma.
Proprietario: fantani (dal 09-06-2008)
Indice Totale Skill (TSI): 2 470
Ingaggio: 708 €/settimana incluso 20% Bonus
Ammonizioni: 0
Infortuni: Nessuno
Specialità: Tecnico
Attendere prego... Attendere prego...
Skill attuali
Resistenza: buono Parate: disastroso
Regia: tremendo Passaggi: debole
Cross: accettabile Difesa: eccellente
Attacco: scarso Calci piazzati: insufficiente
questo invece funziona!!
quando lo salvo mi dice qualcosa sui caratteri unicode e ascii che invece non mi dice quando salvo quell'altro....che c'entri qualcosa..:mad:
p.s. grazie del link! le avevo studiate un annetto fa ma mi son dimenticato tutto o quasi ora me lo risguardo!
wizard1993
02-01-2009, 23:19
l'errore è nella parte relativa al tsi, da una parte è di 4 cifre e ha uno spazio, nell'altro non ha questo spazio, è questo che lo fa incavolare
moritzplatz
02-01-2009, 23:26
l'errore è nella parte relativa al tsi, da una parte è di 4 cifre e ha uno spazio, nell'altro non ha questo spazio, è questo che lo fa incavolare
hai ragione......
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
tsi = tsi.erase(trovato,1);
istringstream temp(tsi);
temp >> valoreInteroTsi;
questa è la parte che lo riguarda.....
è strano però...
dovrebbe dare lo stesso problema sullo stipendio e invece no!
wizard1993
02-01-2009, 23:31
stipendio è dopo, lui crasha al primo errore, se correggi questo e non quello al prossimo sei punto e a capo
wizard1993
02-01-2009, 23:57
risolto,
find_frist_of ritorna il limite di int (2^32-1) se non trova cosa gli interressa, tale valore è rappresentato dalla costante
string::npos
facendo un piccolo test case
si elimina il problema
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
#include <cmath>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
clog<<"error opening file";
return -1;
}
map<string,int> scalaValori;
scalaValori["inesistente"] = 0;
scalaValori["disastroso"] = 1;
scalaValori["tremendo"] = 2;
scalaValori["scarso"] = 3;
scalaValori["debole"] = 4;
scalaValori["insufficiente"] = 5;
scalaValori["accettabile"] = 6;
scalaValori["buono"] = 7;
scalaValori["eccellente"] = 8;
scalaValori["formidabile"] = 9;
scalaValori["straordinario"] = 10;
scalaValori["splendido"] = 11;
scalaValori["magnifico"] = 12;
scalaValori["fuoriclasse"] = 13;
scalaValori["sovrannaturale"]= 14;
scalaValori["titanico"] = 15;
scalaValori["extraterrestre"]= 16;
scalaValori["mitico"] = 17;
scalaValori["magico"] = 18;
scalaValori["utopico"] = 19;
scalaValori["divino"] = 20;
string buffer;
int id;
int percentuale;
int valoreInteroTsi;
int valoreInteroStipendio;
int intcross;
int intregia;
int intforma;
int intresistenza;
int intparate;
int intpassaggi;
int intdifesa;
int intattacco;
int intcalcipiazzati;
string nome;
string cognome;
string forma;
string resistenza;
string parate;
string tsi;
string stipendio;
string regia;
string passaggi;
string cross;
string difesa;
string attacco;
string calcipiazzati;
size_t trovato;
size_t trovato1;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in,buffer,' ');//ignora la seconda riga
getline(in,buffer);//ignora la terza riga
getline(in,forma,' ');//legge la forma
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,resistenza,' ');//legge la resistenza
getline(in,buffer);
getline(in,buffer); //ignoro tre righe
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,':');
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
if(trovato!=string::npos)
tsi = tsi.erase(trovato,1);
istringstream temp(tsi);
temp >> valoreInteroTsi;
getline(in,buffer,' ');
getline(in,stipendio,'€');
stipendio.erase(0,1);
trovato1=stipendio.find_first_of(' ');
if(trovato1!=string::npos)
stipendio= stipendio.erase(trovato1,1);
istringstream temp1(stipendio);
temp1 >> valoreInteroStipendio;
getline(in,buffer,'o');
in >> percentuale;
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,parate);
getline(in,buffer,' ');
getline(in,regia,' ');
getline(in,buffer,' ');
getline(in,passaggi);
getline(in,buffer,' ');
getline(in,cross,' ');
getline(in,buffer,' ');
getline(in,difesa);
getline(in,buffer,' ');
getline(in,attacco,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,calcipiazzati);
intcross=scalaValori[cross];
intdifesa=scalaValori[difesa];
intattacco=scalaValori[cross];
intcalcipiazzati=scalaValori[calcipiazzati];
intforma=scalaValori[forma];
intresistenza=scalaValori[resistenza];
intparate=scalaValori[parate];
intpassaggi=scalaValori[passaggi];
intregia=scalaValori[regia];
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
cout<<"Forma: "<<forma<<endl;
cout<<"Resistenza: "<<resistenza<<endl;
cout<<"Tsi: "<<valoreInteroTsi<<endl;
cout<<"Stipendio: "<<stipendio;
if (percentuale == 20) cout<<" incluso bonus"<<endl; //c'è o no il bonus??
else cout<<endl;
cout<<"Parate: "<<parate<<endl;
cout<<"Regia: "<<regia<<endl;
cout<<"Passaggi: "<<passaggi<<endl;
cout<<"Cross: "<<cross<<endl;
cout<<"Difesa: "<<difesa<<endl;
cout<<"Attacco: "<<attacco<<endl;
cout<<"Calci Piazzati: "<<calcipiazzati<<endl;
}
inoltre ho ripulito il codice da degli errori sparsi: se te fai l'erase ad ogni variabile trinci l'iniziale, quindi ho rimediato
moritzplatz
03-01-2009, 00:16
risolto,
find_frist_of ritorna il limite di int (2^32-1) se non trova cosa gli interressa, tale valore è rappresentato dalla costante
string::npos
facendo un piccolo test case
si elimina il problema
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
#include <cmath>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
clog<<"error opening file";
return -1;
}
map<string,int> scalaValori;
scalaValori["inesistente"] = 0;
scalaValori["disastroso"] = 1;
scalaValori["tremendo"] = 2;
scalaValori["scarso"] = 3;
scalaValori["debole"] = 4;
scalaValori["insufficiente"] = 5;
scalaValori["accettabile"] = 6;
scalaValori["buono"] = 7;
scalaValori["eccellente"] = 8;
scalaValori["formidabile"] = 9;
scalaValori["straordinario"] = 10;
scalaValori["splendido"] = 11;
scalaValori["magnifico"] = 12;
scalaValori["fuoriclasse"] = 13;
scalaValori["sovrannaturale"]= 14;
scalaValori["titanico"] = 15;
scalaValori["extraterrestre"]= 16;
scalaValori["mitico"] = 17;
scalaValori["magico"] = 18;
scalaValori["utopico"] = 19;
scalaValori["divino"] = 20;
string buffer;
int id;
int percentuale;
int valoreInteroTsi;
int valoreInteroStipendio;
int intcross;
int intregia;
int intforma;
int intresistenza;
int intparate;
int intpassaggi;
int intdifesa;
int intattacco;
int intcalcipiazzati;
string nome;
string cognome;
string forma;
string resistenza;
string parate;
string tsi;
string stipendio;
string regia;
string passaggi;
string cross;
string difesa;
string attacco;
string calcipiazzati;
size_t trovato;
size_t trovato1;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in,buffer,' ');//ignora la seconda riga
getline(in,buffer);//ignora la terza riga
getline(in,forma,' ');//legge la forma
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,resistenza,' ');//legge la resistenza
getline(in,buffer);
getline(in,buffer); //ignoro tre righe
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,':');
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
if(trovato!=string::npos)
tsi = tsi.erase(trovato,1);
istringstream temp(tsi);
temp >> valoreInteroTsi;
getline(in,buffer,' ');
getline(in,stipendio,'€');
stipendio.erase(0,1);
trovato1=stipendio.find_first_of(' ');
if(trovato1!=string::npos)
stipendio= stipendio.erase(trovato1,1);
istringstream temp1(stipendio);
temp1 >> valoreInteroStipendio;
getline(in,buffer,'o');
in >> percentuale;
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,parate);
getline(in,buffer,' ');
getline(in,regia,' ');
getline(in,buffer,' ');
getline(in,passaggi);
getline(in,buffer,' ');
getline(in,cross,' ');
getline(in,buffer,' ');
getline(in,difesa);
getline(in,buffer,' ');
getline(in,attacco,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,calcipiazzati);
intcross=scalaValori[cross];
intdifesa=scalaValori[difesa];
intattacco=scalaValori[cross];
intcalcipiazzati=scalaValori[calcipiazzati];
intforma=scalaValori[forma];
intresistenza=scalaValori[resistenza];
intparate=scalaValori[parate];
intpassaggi=scalaValori[passaggi];
intregia=scalaValori[regia];
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
cout<<"Forma: "<<forma<<endl;
cout<<"Resistenza: "<<resistenza<<endl;
cout<<"Tsi: "<<valoreInteroTsi<<endl;
cout<<"Stipendio: "<<stipendio;
if (percentuale == 20) cout<<" incluso bonus"<<endl; //c'è o no il bonus??
else cout<<endl;
cout<<"Parate: "<<parate<<endl;
cout<<"Regia: "<<regia<<endl;
cout<<"Passaggi: "<<passaggi<<endl;
cout<<"Cross: "<<cross<<endl;
cout<<"Difesa: "<<difesa<<endl;
cout<<"Attacco: "<<attacco<<endl;
cout<<"Calci Piazzati: "<<calcipiazzati<<endl;
}
inoltre ho ripulito il codice da degli errori sparsi: se te fai l'erase ad ogni variabile trinci l'iniziale, quindi ho rimediato
grazie mille!
in questo modo però si perdono i map......
in questo modo non posso più trasformarli in numeri (i valori come insufficiente,accettabile, scarso) dunque quegli erase non li avevo messi per nulla :)
non ho capito quale era il problema....
moritzplatz
03-01-2009, 00:23
ecco ho integrato la parte del tsi....
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
using namespace std;
int main() {
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
return -1;
}
map<string,int> scalaValori;
scalaValori["inesistente"] = 0;
scalaValori["disastroso"] = 1;
scalaValori["tremendo"] = 2;
scalaValori["scarso"] = 3;
scalaValori["debole"] = 4;
scalaValori["insufficiente"] = 5;
scalaValori["accettabile"] = 6;
scalaValori["buono"] = 7;
scalaValori["eccellente"] = 8;
scalaValori["formidabile"] = 9;
scalaValori["straordinario"] = 10;
scalaValori["splendido"] = 11;
scalaValori["magnifico"] = 12;
scalaValori["fuoriclasse"] = 13;
scalaValori["sovrannaturale"]= 14;
scalaValori["titanico"] = 15;
scalaValori["extraterrestre"]= 16;
scalaValori["mitico"] = 17;
scalaValori["magico"] = 18;
scalaValori["utopico"] = 19;
scalaValori["divino"] = 20;
string buffer;
int id;
int TSI;
int STIPENDIO;
int percentuale;
int valoreInteroTsi;
int valoreInteroStipendio;
int intcross;
int intregia;
int intforma;
int intresistenza;
int intparate;
int intpassaggi;
int intdifesa;
int intattacco;
int intcalcipiazzati;
string nome;
string cognome;
string forma;
string resistenza;
string parate;
string tsi;
string stipendio;
string regia;
string passaggi;
string cross;
string difesa;
string attacco;
string calcipiazzati;
size_t trovato;
size_t trovato1;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in,buffer,' ');//ignora la seconda riga
getline(in,buffer);//ignora la terza riga
getline(in,forma,' ');//legge la forma
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,resistenza,' ');//legge la resistenza
getline(in,buffer);
getline(in,buffer); //ignoro tre righe
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,':');
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
if(trovato!=string::npos)
tsi = tsi.erase(trovato,1);
istringstream temp(tsi);
temp >> valoreInteroTsi;
getline(in,buffer,' ');
getline(in,stipendio,'€');
stipendio.erase(0,1);
trovato1=stipendio.find_first_of(' ');
if(trovato1!=string::npos)
stipendio= stipendio.erase(trovato1,1);
istringstream temp1(stipendio);
temp1 >> valoreInteroStipendio;
getline(in,buffer,'o');
in >> percentuale;
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,parate);
parate=parate.erase(0,1);
getline(in,buffer,' ');
getline(in,regia,' ');
regia=regia.erase(0,1);
getline(in,buffer,' ');
getline(in,passaggi);
passaggi= passaggi.erase(0,1);
getline(in,buffer,' ');
getline(in,cross,' ');
cross = cross.erase(0,1);
getline(in,buffer,' ');
getline(in,difesa);
difesa = difesa.erase(0,1);
getline(in,buffer,' ');
getline(in,attacco,' ');
attacco=attacco.erase(0,1);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,calcipiazzati);
calcipiazzati=calcipiazzati.erase(0,1);
forma=forma.erase(0,1);
resistenza=resistenza.erase(0,0);
intcross=scalaValori[cross];
intdifesa=scalaValori[difesa];
intattacco=scalaValori[cross];
intcalcipiazzati=scalaValori[calcipiazzati];
intforma=scalaValori[forma];
intresistenza=scalaValori[resistenza];
intparate=scalaValori[parate];
intpassaggi=scalaValori[passaggi];
intregia=scalaValori[regia];
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
cout<<"Forma: "<<forma<<endl;
cout<<"Resistenza: "<<resistenza<<endl;
cout<<"Tsi: "<<valoreInteroTsi<<endl;
cout<<"Stipendio: "<<stipendio;
if (percentuale == 20) cout<<" incluso bonus"<<endl; //c'è o no il bonus??
else cout<<endl;
cout<<"Parate: "<<parate<<endl;
cout<<"Regia: "<<regia<<endl;
cout<<"Passaggi: "<<passaggi<<endl;
cout<<"Cross: "<<cross<<endl;
cout<<"Difesa: "<<difesa<<endl;
cout<<"Attacco: "<<attacco<<endl;
cout<<"Calci Piazzati: "<<calcipiazzati<<endl;
}
questo è funzionante :) :)
non ho capito nemmeno il problema che mi darebbero gli erase...
io li ho rimessi perchè altrimenti non potrei far diventare le stringhe interi!
wizard1993
03-01-2009, 10:43
un output come questo è il problema
Parate: isastroso
Regia: carso
Passaggi: nsufficiente
Cross: carso
Difesa: uono
Attacco: ebole
Calci Piazzati: isastroso
come poi notare manca l'iniziale
moritzplatz
03-01-2009, 11:12
a me non da questo problema!
a me li stampa tutti per bene e il map funziona!
moritzplatz
03-01-2009, 14:11
bene ora che abbiamo risoplto questo spiacevole inconveniente....qualche consiglio per la classe giocatore?
wizard1993
03-01-2009, 15:37
piazzaci tutti i campi dentro e crea una funzione membre che si chiama come ti pare (tipo get data) e schiaffaci tutto il codice dentro seguendo la guida che ti ho postato
moritzplatz
03-01-2009, 17:16
ok ho iniziato la classe!
ho fatto un file giocatore.h contenente questo:
class giocatore
{
public:
string nome;
int forma;
int resistenza;
int parate;
int regia;
int passaggi;
int cross;
int difesa;
int attacco;
int cp;
}
ora devo fare il .cpp vero?
wizard1993
03-01-2009, 17:18
c'è un errore, la graffa che chiude la classe deve essere seguita da ;
Poi ovviamente ci devi inserire tutti i metodi.
moritzplatz
03-01-2009, 17:58
ok quindi ora correggo il .h
poi faccio il .cpp e , dopo aver incluso giocatore.h ci faccio un metodo
int main(){
void getdata(){
tutto il main del file di prima
}
}
e poi ho riempito di valori la classe?
moritzplatz: mi sembra o stai andando un po' a caso con il C++ ? :D
wizard1993
03-01-2009, 18:06
hai letto quella guida? decisamente no
nel file classe.h devi anche dicharare l'intestazione dei metodi tipo
class prova{
// qui metti le variabili
public:
void getdata();
};
poi nel file classe.cpp
metterai
void classe::getdata(){
//do some
}
nel file main.cpp
metterai
#include "classe.h"
int main(){
classe c();
c.getdata();
}
moritzplatz
03-01-2009, 18:17
moritzplatz: mi sembra o stai andando un po' a caso con il C++ ? :D
non proprio a caso :) :) :)
un po di cose le ho capite bene....il mio problema è quando si comincia a parlare di classi e puntatori :sofico: :sofico: :sofico:
ovvero diciamo un 90,2% del linguaggio :)
comunque lo avevo studiato per bene un anno fa....ero anche riuscito a fare un programma del ping pong!
con tanto di doppi comandi e di possibilità multiplayer...(uno usava le frecce e l'altro A;S;D e W....
ora sto cercando di riprendere con questo programma che vorrei far diventare molto più esteso e utile di quello che è ora!
@wizard l'ho letta la guida e ho chiesto conferma per vedere se avevo capito i passaggi da fare :) :)
moritzplatz
03-01-2009, 18:29
bon ho fatto quello che mi hai detto!
questi sono i tre file:
MAIN:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
#include "giocatore.h"
int main() {
giocatore primo();
giocatore.getdata();
return 0;
}
giocatore.h:
class giocatore
{
public:
void getdata();
string nome;
int forma;
int resistenza;
int parate;
int regia;
int passaggi;
int cross;
int difesa;
int attacco;
int cp;
};
giocatore.cpp:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
include "giocatore.h"
using namespace std;
int main(){
void classe::getdata(){
fstream in("file.txt");
if(in.is_open()){
cout<<"";
}
else{
cerr<<"error opening file";
return -1;
}
map<string,int> scalaValori;
scalaValori["inesistente"] = 0;
scalaValori["disastroso"] = 1;
scalaValori["tremendo"] = 2;
scalaValori["scarso"] = 3;
scalaValori["debole"] = 4;
scalaValori["insufficiente"] = 5;
scalaValori["accettabile"] = 6;
scalaValori["buono"] = 7;
scalaValori["eccellente"] = 8;
scalaValori["formidabile"] = 9;
scalaValori["straordinario"] = 10;
scalaValori["splendido"] = 11;
scalaValori["magnifico"] = 12;
scalaValori["fuoriclasse"] = 13;
scalaValori["sovrannaturale"]= 14;
scalaValori["titanico"] = 15;
scalaValori["extraterrestre"]= 16;
scalaValori["mitico"] = 17;
scalaValori["magico"] = 18;
scalaValori["utopico"] = 19;
scalaValori["divino"] = 20;
string buffer;
int id;
int TSI;
int STIPENDIO;
int percentuale;
int valoreInteroTsi;
int valoreInteroStipendio;
int intcross;
int intregia;
int intforma;
int intresistenza;
int intparate;
int intpassaggi;
int intdifesa;
int intattacco;
int intcalcipiazzati;
string nome;
string cognome;
string forma;
string resistenza;
string parate;
string tsi;
string stipendio;
string regia;
string passaggi;
string cross;
string difesa;
string attacco;
string calcipiazzati;
size_t trovato;
size_t trovato1;
getline(in, nome, ' '); //legge il nome
getline(in, cognome, ' '); //legge il cognome
getline(in, buffer, '('); //salta fino alla '('
in >> id; //legge l'id
getline(in,buffer,' ');//ignora la seconda riga
getline(in,buffer);//ignora la terza riga
getline(in,forma,' ');//legge la forma
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,resistenza,' ');//legge la resistenza
getline(in,buffer);
getline(in,buffer); //ignoro tre righe
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,':');
getline(in,tsi);
tsi.erase(0,1);
trovato=tsi.find_first_of(' ');
if(trovato!=string::npos)
tsi = tsi.erase(trovato,1);
istringstream temp(tsi);
temp >> valoreInteroTsi;
getline(in,buffer,' ');
getline(in,stipendio,'€');
stipendio.erase(0,1);
trovato1=stipendio.find_first_of(' ');
if(trovato1!=string::npos)
stipendio= stipendio.erase(trovato1,1);
istringstream temp1(stipendio);
temp1 >> valoreInteroStipendio;
getline(in,buffer,'o');
in >> percentuale;
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,parate);
parate=parate.erase(0,1);
getline(in,buffer,' ');
getline(in,regia,' ');
regia=regia.erase(0,1);
getline(in,buffer,' ');
getline(in,passaggi);
passaggi= passaggi.erase(0,1);
getline(in,buffer,' ');
getline(in,cross,' ');
cross = cross.erase(0,1);
getline(in,buffer,' ');
getline(in,difesa);
difesa = difesa.erase(0,1);
getline(in,buffer,' ');
getline(in,attacco,' ');
attacco=attacco.erase(0,1);
getline(in,buffer,' ');
getline(in,buffer,' ');
getline(in,calcipiazzati);
calcipiazzati=calcipiazzati.erase(0,1);
forma=forma.erase(0,1);
resistenza=resistenza.erase(0,0);
intcross=scalaValori[cross];
intdifesa=scalaValori[difesa];
intattacco=scalaValori[cross];
intcalcipiazzati=scalaValori[calcipiazzati];
intforma=scalaValori[forma];
intresistenza=scalaValori[resistenza];
intparate=scalaValori[parate];
intpassaggi=scalaValori[passaggi];
intregia=scalaValori[regia];
cout<<nome<<endl;
cout<<cognome<<endl;
cout<<id<<endl;
cout<<"Forma: "<<forma<<endl;
cout<<"Resistenza: "<<resistenza<<endl;
cout<<"Tsi: "<<valoreInteroTsi<<endl;
cout<<"Stipendio: "<<stipendio;
if (percentuale == 20) cout<<" incluso bonus"<<endl; //c'è o no il bonus??
else cout<<endl;
cout<<"Parate: "<<parate<<endl;
cout<<"Regia: "<<regia<<endl;
cout<<"Passaggi: "<<passaggi<<endl;
cout<<"Cross: "<<cross<<endl;
cout<<"Difesa: "<<difesa<<endl;
cout<<"Attacco: "<<attacco<<endl;
cout<<"Calci Piazzati: "<<calcipiazzati<<endl;
}
}
peccato che mi dia un errore....
prima me lo dava nel main sulla riga : "using namespace ..." allora la ho eliminata e tutto ok!:read:
poi ora mi da un errore in giocatore.h alla linea : "string nome;" dice che string non è un tipo..... ma io ho incluso in giocatore.cpp string....
Vincenzo1968
03-01-2009, 20:09
Io con l'automa ottengo questo:
http://www.guidealgoritmi.it/images/ImgForums/AutomaGiocatore1.jpg
int main()
{
Giocatore g;
g.ReadFromFile("Giocatore1.txt");
cout << "id : " << g.getId() << endl;
cout << "nome : " << g.getNome() << endl;
cout << "forma : " << g.getForma() << endl;
cout << "resistenza : " << g.getResistenza() << endl;
cout << "parate : " << g.getParate() << endl;
cout << "tsi : " << g.getTsi() << endl;
cout << "stipendio : " << g.getStipendio() << endl;
cout << "regia : " << g.getRegia() << endl;
cout << "passaggi : " << g.getPassaggi() << endl;
cout << "cross : " << g.getCross() << endl;
cout << "difesa : " << g.getDifesa() << endl;
cout << "attacco : " << g.getAttacco() << endl;
cout << "calci piazzati : " << g.getCalciPiazzati() << endl;
return 0;
}
:bimbo:
moritzplatz
03-01-2009, 20:18
davvero notevole!
e se ti do questo come imput:
Jarl Hvalsøe Schou (215521299) [Messo in vendita]
Danmark 18 anni e 49 giorni, Prossimo compleanno: 07-03-2009
debole di forma, accettabile in resistenza
Una persona scontrosa, irascibile e disonesta.
È disastroso in esperienza e insufficiente in carisma.
Proprietario: fantani (dal 12-09-2008)
Indice Totale Skill (TSI): 800
Ingaggio: 396 €/settimana incluso 20% Bonus
Ammonizioni: 0
Infortuni: Nessuno
Specialità: Imprevedibile
Attendere prego... Attendere prego...
Skill attuali
Resistenza: accettabile Parate: disastroso
Regia: scarso Passaggi: insufficiente
Cross: scarso Difesa: buono
Attacco: debole Calci piazzati: disastroso
io anche ottengo lo stesso, a parte il nome e l'id!
solamente che, come avrai visto il mio è un codice veramente confuso e, se dovessi cambiare qualcosa, non riuscirei mai a aggiustarlo!
moritzplatz
03-01-2009, 20:35
una volta presa una stringa e trovato un carattere come faccio a cancellare la stringa da quel carattere alla fine?
Vincenzo1968
03-01-2009, 20:40
davvero notevole!
e se ti do questo come imput:
...
io anche ottengo lo stesso, a parte il nome e l'id!
solamente che, come avrai visto il mio è un codice veramente confuso e, se
dovessi cambiare qualcosa, non riuscirei mai a aggiustarlo!
http://www.guidealgoritmi.it/images/ImgForums/AutomaGiocatore5.jpg
Domani posto il codice. Voglio modificare l'automa in modo da fargli leggere i file e in formato ANSI, e in formato UNICODE.
:bimbo:
moritzplatz
03-01-2009, 21:22
come mai ti da resistenza 0?
Il tuo codice non è confuso, basta rimettere insieme le cose, ad esempio fare una classe di utilità che recupera i dati dal file. Con pochi passaggi potrebbe diventare così:
DataFileReader file("nomefile");
file.readString(nome);
file.readString(cognome);
file.skipUntil('(');
id = file.parseInt();
file.skipLine();
file.skipLine();
file.skipLine();
file.readString(forma);
file.skipUntil(',');
file.readString(resistenza);
file.skipLine();
...e così via. Basterebbe usare un po' gli strumenti che ti mette a disposizione il linguaggio.
Vincenzo1968
03-01-2009, 21:52
come mai ti da resistenza 0?
C'era un bachetto ma l'ho sistemato ;)
http://www.guidealgoritmi.it/images/ImgForums/AutomaGiocatore5.jpg
:bimbo:
moritzplatz
03-01-2009, 22:48
Il tuo codice non è confuso, basta rimettere insieme le cose, ad esempio fare una classe di utilità che recupera i dati dal file. Con pochi passaggi potrebbe diventare così:
DataFileReader file("nomefile");
file.readString(nome);
file.readString(cognome);
file.skipUntil('(');
id = file.parseInt();
file.skipLine();
file.skipLine();
file.skipLine();
file.readString(forma);
file.skipUntil(',');
file.readString(resistenza);
file.skipLine();
...e così via. Basterebbe usare un po' gli strumenti che ti mette a disposizione il linguaggio.
messo così sarebbe più ordinato!
bisogna creare una classe dunque....
allora ne potrei fare 2:
class giocatore e class utility!
è una buona idea?
ci potrei riuscire secondo te?
ci potrei riuscire secondo te?
Se conosci il C++ sì, ci vogliono 10 minuti.
moritzplatz
03-01-2009, 23:03
ad esempio:
ho messo il prototipo prima del main
void saltariga();
poi sotto il main vado a scrivere:
void saltariga(){
string buffer;
string in;
getline(in,buffer);
}
eppure non funziona....
forse in non è una stringa!
io ricordavo che le funzioni si facessero così....
moritzplatz
03-01-2009, 23:11
sono andato a cercarmi la funzione getline
si prende una stringa e un istram oppure una stringa, un istream e un carattere....
allora ho cambiato la funzione scrivendo:
istram in;
string buffer;
getline(in, buffer);
a questo punto mi da uno strano errore:
mi apre la classe istream e mi evidenzia sta riga:
basic_istream(): _M_gcount(streamsize(0)) { }
Io non vorrei ribadire, ma mi vedo costretto: non si può andare a caso con un linguaggio di programmazione come il C++. Ignori come si costruisca una classe, ma anche come si costruisca un funzione :boh: Praticamente dobbiamo farti il 90% del programma ed il resto lo fai per tentativi.
moritzplatz
03-01-2009, 23:56
Io non vorrei ribadire, ma mi vedo costretto: non si può andare a caso con un linguaggio di programmazione come il C++. Ignori come si costruisca una classe, ma anche come si costruisca un funzione :boh: Praticamente dobbiamo farti il 90% del programma ed il resto lo fai per tentativi.
bhe almeno la funzione l'ho costruita bene.....
prototipo prima del main....sotto gli include e poi la funzione vera e propria dopo la fine del main....
il problema non è in come ho costruito la funzione....secondo me il problema è in getline....
nonn credo di essere proprio a zero.....
io avevo studiato questo libro: "programmare in c++" della o'reilly.....
però mi sa che è vecchio e non aggiornato.....tutte ste cose non ci sono:( :( :(
E' fatta male anche la funzione, quelle due variabili che hai dichiarato devono essere parametri.
moritzplatz
04-01-2009, 00:03
vabbene....
riuscirò a farlo ordinatissimo.
ora mi ci metto.....ricordati questo topic.....quando avrò finito lo posterò e spero di vedere un tuo commento :)
grazie ancora per tutto l'aiuto che mi hai dato!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.