2013-04-18 10 views
14

Ho una std :: map.C++ Serialize/Deserialize std :: map <int,int> da/a file

Vorrei sapere se riesco a scriverlo in un file (e anche a leggerlo da un file) in come 1 riga usando fwrite, o se ho bisogno di scrivere/leggere ogni valore separatamente.

Speravo che dal momento che non è niente di speciale, questo potrebbe essere possibile.

+1

La serializzazione non è un compito completamente banale. Ma è stato fatto prima. Dai un'occhiata a [boost :: serialization] (http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html) per esempio. Viene fornito con un codice pronto per serializzare i contenitori della libreria std, incluso 'std :: maps'. – juanchopanza

+1

'fwrite' è un C-ismo. –

risposta

24

utilizzare boost::serialization per serializzare in una riga. Testata per esso:

boost/serialization/map.hpp 

Codice esempio

#include <map> 
#include <sstream> 
#includ <iostream> 
#include <boost/serialization/map.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 

int main() 
{ 
    std::map<int, int> map = {{1,2}, {2,1}}; 
    std::stringstream ss; 
    boost::archive::text_oarchive oarch(ss); 
    oarch << map; 
    std::map<int, int> new_map; 
    boost::archive::text_iarchive iarch(ss); 
    iarch >> new_map; 
    std::cout << (map == new_map) << std::endl; 
} 

uscita:

g++ -o new new.cpp -std=c++0x -lboost_serialization 
./new 
1 

per il file semplicemente utilizzare std::ifstream/std::ofstream invece di std::stringstream e può essere binary_archive, invece di text_archive.

1

Non c'è un one-liner per serializzare una mappa. Dovresti scrivere ogni coppia chiave/valore individualmente. Questo in realtà non è molto più complicato di un ciclo for, però.

Utilizzando boost, potrebbe esserci un modo, ma non ho familiarità con le API esatte.

Problemi correlati