Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
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)
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


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
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...
30 anni di PlayStation da indossare: arr...
Amazon lancia gli Echo più potent...
Amazon rinnova la gamma Fire TV: ecco le...
Ring lancia le sue prime videocamere con...
Blink amplia la gamma di videocamere di ...
Jaguar Land Rover riprende (gradualmente...
HONOR inaugura il primo ALPHA Flagship S...
Yamaha: ecco il brevetto del 'finto moto...
'Console obsoleta e utenti ingannati': u...
Stop al ransomware su Google Drive, graz...
L'IA è la nuova interfaccia utent...
Battlefield 6: confermata la dimensione ...
Windows 11 porta il Wi-Fi 7 alle aziende...
Logitech MX Master 4 subito disponibile ...
'Nonna Skyrim' dice addio all'RPG di Bet...
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: 17:40.


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