Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Quattro modi di indossarlo, stessa app del Plaud Note Pro e integrazione con il desktop. Il registratore IA da indossare di Plaud eccelle in mobilità, ma resta vincolato all'abbonamento ed è facile da perdere
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Xiaomi ha portato Redmi Watch 6 anche sul mercato italiano, puntando su un display AMOLED da 2,07 pollici con picco di luminosità a 2000 nit, frame in alluminio da 9,9mm e un'autonomia dichiarata di 12 giorni. Lo smartwatch gira su HyperOS 3 e integra GPS, Bluetooth 5.4 e oltre 150 sport mode. Il tutto a meno di 100 euro
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Con 22 tasti, il pulsante 5D, lo Shift Mode e il sensore PixArt 3395 da 26.000 DPI, il nuovo mouse wireless di Mad Catz si rivolge in modo preciso ai giocatori di MMO e RPG. Ma chi conosce già il R.A.T. 8+ ADV si accorgerà subito di quanto i due prodotti condividano, e di dove invece divergono
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: 8897
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


Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare Reolink OMVI 3i WiFi: videosorveglianza pi&ugrav...
Formula V vi farà cambiare l'airf...
Netflix usa l'IA generativa per battere ...
Quando l'AI costruisce sé stessa:...
Meno ventole, più raffreddamento:...
Adidas Trionda: come funziona la tecnolo...
Withings BodyFit, la bilancia che va ben...
QNAP annuncia QuTS hero h6.0: il sistema...
ColorOS 17 con Android 17: la lista dei ...
DDR4, il ritorno che nessuno si aspettav...
Corsair vuole un singolo cavo per colleg...
Linux 7.2 si avvierà sui Mac M3, ...
Xiaomi 17T e 17T Pro a prezzi mai visti:...
Microsoft annuncia Majorana 2 e prevede ...
Windows 11: addio ai menu contestuali ca...
Maxi raid internazionale contro la pirat...
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: 18:46.


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