You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.9 KiB
64 lines
1.9 KiB
#include <iostream>
|
|
#include <algorithm>
|
|
#include <fstream>
|
|
|
|
#include <sparsepp/spp.h>
|
|
using spp::sparse_hash_map;
|
|
|
|
using namespace std;
|
|
|
|
struct StringToIntSerializer
|
|
{
|
|
bool operator()(std::ofstream* stream, const std::pair<const std::string, int>& value) const
|
|
{
|
|
size_t sizeSecond = sizeof(value.second);
|
|
size_t sizeFirst = value.first.size();
|
|
stream->write((char*)&sizeFirst, sizeof(sizeFirst));
|
|
stream->write(value.first.c_str(), sizeFirst);
|
|
stream->write((char*)&value.second, sizeSecond);
|
|
return true;
|
|
}
|
|
|
|
bool operator()(std::ifstream* istream, std::pair<const std::string, int>* value) const
|
|
{
|
|
// Read key
|
|
size_t size = 0;
|
|
istream->read((char*)&size, sizeof(size));
|
|
char * first = new char[size];
|
|
istream->read(first, size);
|
|
new (const_cast<string *>(&value->first)) string(first, size);
|
|
|
|
// Read value
|
|
istream->read((char *)&value->second, sizeof(value->second));
|
|
return true;
|
|
}
|
|
};
|
|
|
|
int main(int , char* [])
|
|
{
|
|
sparse_hash_map<string, int> users;
|
|
|
|
users["John"] = 12345;
|
|
users["Bob"] = 553;
|
|
users["Alice"] = 82200;
|
|
|
|
// Write users to file "data.dat"
|
|
// ------------------------------
|
|
std::ofstream* stream = new std::ofstream("data.dat",
|
|
std::ios::out | std::ios::trunc | std::ios::binary);
|
|
users.serialize(StringToIntSerializer(), stream);
|
|
stream->close();
|
|
delete stream;
|
|
|
|
// Read from file "data.dat" into users2
|
|
// -------------------------------------
|
|
sparse_hash_map<string, int> users2;
|
|
std::ifstream* istream = new std::ifstream("data.dat");
|
|
users2.unserialize(StringToIntSerializer(), istream);
|
|
istream->close();
|
|
delete istream;
|
|
|
|
for (sparse_hash_map<string, int>::iterator it = users2.begin(); it != users2.end(); ++it)
|
|
printf("users2: %s -> %d\n", it->first.c_str(), it->second);
|
|
|
|
}
|