Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-05-2005, 17:18   #1
NA01
Senior Member
 
L'Avatar di NA01
 
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!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2005, 10:12   #2
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2005, 10:25   #3
Fenomeno85
Senior Member
 
L'Avatar di Fenomeno85
 
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 quindi mi sa che avevi sbagliato a implementare

~§~ 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
Fenomeno85 è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2005, 11:45   #4
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da NA01
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!
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); 
}
Ti ho fatto un esempio con mappe di stringhe ma puoi semplicemente convertire i tipi che usi per chiave e valore a stringhe e poi salvarli in un file di testo riga per riga.
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).
fek è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2005, 14:46   #5
NA01
Senior Member
 
L'Avatar di NA01
 
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!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2005, 18:29   #6
NA01
Senior Member
 
L'Avatar di NA01
 
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
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2005, 19:11   #7
cionci
Senior Member
 
L'Avatar di cionci
 
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;
}
Ma come puoi fare in questo modo se string è vuota ???? string la devi passare per riferimento... Se la passi per copia i valori inseriti nel chiamante non li vedi...
Codice:
pair<string, int> tmp;
while(!in.eof())
{
   in >> tmp.first >> tmp.second;
   string.insert(tmp);
}
Attento all'eof...forse c'è da gestirlo in maniera diversa...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2005, 20:16   #8
NA01
Senior Member
 
L'Avatar di NA01
 
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!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2005, 23:23   #9
cionci
Senior Member
 
L'Avatar di cionci
 
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2005, 11:23   #10
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da cionci
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));
Io che sono pigro in genere uso std::make_pair:

string.insert(std::make_pair("a", 1));
string.insert(std::make_pair("b", 2));
fek è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2005, 11:37   #11
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da NA01
- a me il problema lo dà >> pos->first non me lo compila....
Mi posti l'errore di compilazione?

Quote:
- alla fine della tua procedura che faccio?
ritorno l'indirizzo di tmp?
Fai come ti ha detto cionci, passa StringMap per reference, cosi':

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(); 
}
"string" (per altro non e' un buon nome, perche' e' una mappa di stringhe non una sola stringa) conterra' la mappa aggiornata perche' e' passato per riferimento.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2005, 15:12   #12
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
Quote:
"string" (per altro non e' un buon nome, perche' e' una mappa di stringhe non una sola stringa) conterra' la mappa aggiornata perche' e' passato per riferimento.

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'
ho risolto piazzando i dati in due variabili temporanee e poi passandole così
Codice:
    stringa[str] = integer;
che però giustamente se passo un puntatore non funziuona più
userò ala tua!

grazie, ciao!

Ultima modifica di NA01 : 10-05-2005 alle 15:18.
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2005, 15:18   #13
cionci
Senior Member
 
L'Avatar di cionci
 
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 ? Poi all'atto pratico è la stessa cosa...ma visto che esiste sfruttiamolo...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Claude Sonnet 4.5, il nuovo modello di A...
Silent Hill f è un successo: gi&a...
Nuova Jeep Compass: aperti i preordini p...
La PS5 Slim con SSD più piccolo s...
Zero combustibili fossili e controllo qu...
Corsair NAUTILUS 360 RS LCD: raffreddame...
Nuovo record nel mondo dei computer quan...
Sony e Universal combatteranno l'IA con....
Il Chips Act europeo attuale è un...
OnePlus 15: debutto globale con design '...
Amazon Prime: addio alla prova gratuita ...
Windows 11 25H2: guida passo-passo per l...
ECOVACS Deebot Mini sotto i 300€, robot ...
USA chiedono a Taiwan di produrre chip i...
Abbiamo provato Nothing Ear (3), gli aur...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v