|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
[c++]come posso salvare le map?
ho un bel programmino che fa un sacco di cose inutili. l'ultima cosa che sarebbe carino implementare è il salvataggio di tutti i dati su hd e la lettura all'avvio successivo.
il problema è che uno dei tipi è contenitire standard map. ho provato (senza crederci) a metterlo su file come se fosse un tipo standard, ma credo giustamente il compilatore mi ha urlato di tutto.... come posso mettere tutti i dati su hd? ciao! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
per forza devi usare i file
![]() ![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Codice:
typedef std::map<std::string, std::string> StringMap; void SaveMap(StringMap stringMap) { FILE fout = fopen("stringmap.txt", "wt"); if (fout == NULL) return; StringMap::iterator pos = stringMap.begin(); StringMap::iterator end = stringMap.end(); for (; pos != end; ++pos) { fprintf(fout, "%s %s\n", pos->first, pos->second); } fclose(fout); } Per legge il file, leggi riga per riga, converti la prima stringa al tipo chiave, la seconda stringa al tipo valore e inserisci nella mappa. Quest'operazione si chiama serializzazione e deserializzazione di un tipo (la mappa).
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
funzia grazie, ridarò un'occhiata al capitolo sugli iteratori
![]() una curiosità. in molti esempi (come nel tuo) di listati in c++ l'accesso a file viene implementato con le funzioni del c di stdio e non con gli stream del c++.... c'è un motivo particolare? ciao! |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
ok, ho modificato la tua funzione e ho riprovato a fare la deserializzazione.
casini assurdi sulle string ![]() ![]() vi dò tutto il sorgente per il salvataggio (incompleto e la gestione degli errori è da rifare, ma non importa per il momento) Codice:
#include <iostream> #include <string> #include <map> #include <fstream> using namespace std; typedef map<string,int> StringMap; class file_state{}; void SaveMap(StringMap string ,char* file) { file_state bad_file; ofstream out(file,ios_base::binary); StringMap::iterator pos = string.begin(); StringMap::iterator end = string.end(); for (; pos != end; ++pos){ out << pos->first << "\n" << pos->second <<"\n"; } if(out.good() == false){ throw(bad_file); } out.close(); } void ReadMap(StringMap string ,char* file) { file_state bad_file; ifstream in(file,ios_base::binary); StringMap::iterator pos = string.begin(); StringMap::iterator end = string.end(); for (; pos != end; ++pos){ in.getline(pos->first,500,"\t"); in >> /*(string)(pos->first) >>*/ pos->second; } if(in.good() == false){ throw(bad_file); } in.close(); } la Save funziona, l'altra.....ho provato in un sacco di modi, ho fatto cast ma non mi vuole leggere quella porca di una string si vede che è da due anni che non metto mano seriamente al c++ ![]() ![]() help! ciao |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
ifstream in(file,ios_base::binary); StringMap::iterator pos = string.begin(); StringMap::iterator end = string.end(); for (; pos != end; ++pos){ in.getline(pos->first,500,"\t"); in >> /*(string)(pos->first) >>*/ pos->second; } Codice:
pair<string, int> tmp; while(!in.eof()) { in >> tmp.first >> tmp.second; string.insert(tmp); } |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
scusa, non vorrei romperti troppo le balle, ma ho qualche domanda
- perchè usi insert sul template tmp? - a me il problema lo dà >> pos->first non me lo compila.... - alla fine della tua procedura che faccio? ritorno l'indirizzo di tmp? grazie della pazienza ciao! |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non devi ritornare l'indirizzo di string perchè devi passare string per riferimento (come ho scritto sopra)...
Uso la insert perchè tmp è un Pair che va inserito nel Map...quando crei un coppia di dati per inserirli nel Map solitamente si usa questo metodo...o più generalmente questo: typedef pair<String, int> StringPair; string.insert(StringPar("a", 1)); string.insert(StringPar("b", 2)); Sul fatto che non ti compili così ad occhio non ti so dire perchè, ma in quel caso pos == end (string è vuota) e quindi comunque non otterresti niente... Devi prendere come riferimento la fine del file per immettere i dati nel map...ed il tipo di dati che si immette in un map di default è un pair con lo stesso template del map... |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
string.insert(std::make_pair("a", 1)); string.insert(std::make_pair("b", 2));
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Codice:
void ReadMap(StringMap& string ,char* file) // per riferimento { file_state bad_file; ifstream in(file,ios_base::binary); while(!in.eof()) { string name; int id; in >> name >> id; string.insert(std::make_pair(name, id)); } in.close(); }
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
Quote:
già, motivo per cui non avevo capito il codice di cionci (prima metto nomi idioti, poi non me ne ricordo) e per cui non ne avevo nemmeno capito il suggerimento. passare una sting per valore quando io volevo una map... non aveva senso, se non nella con la mia idiozia nello scegliere i nomi ![]() ![]() ecco l'errore: Codice:
file.cpp: In function `void ReadMap(StringMap*, char*)': file.cpp:34: error: 'class std::map<std::string, int, std::less<std::string>, std::allocator<std::pair<const std::string, int> > >' has no member named ' first' file.cpp:34: error: 'class std::map<std::string, int, std::less<std::string>, std::allocator<std::pair<const std::string, int> > >' has no member named ' second' Codice:
stringa[str] = integer; ![]() userò ala tua! grazie, ciao! Ultima modifica di NA01 : 10-05-2005 alle 15:18. |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Strano...mi fai vedere come era il codice ?
void ReadMap(StringMap*, char*) Comunque perchè passi per indirizzo quando hanno inventato appositamente il passaggio per riferimento ? ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:19.