flyweight/example/serialization.cpp
2014-09-01 17:24:12 +02:00

134 lines
3.5 KiB
C++

/* Boost.Flyweight example of serialization.
*
* Copyright 2006-2014 Joaquin M Lopez Munoz.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*
* See http://www.boost.org/libs/flyweight for library home page.
*/
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
#include <algorithm>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/flyweight.hpp>
#include <boost/flyweight/serialize.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/tokenizer.hpp>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <stdexcept>
#include <string>
#include <vector>
using namespace boost::flyweights;
typedef flyweight<std::string> fw_string;
typedef std::vector<fw_string> text_container;
/* Read a text file into a text_container and serialize to an archive. */
void save_serialization_file()
{
/* Define a tokenizer on std::istreambuf. */
typedef std::istreambuf_iterator<char> char_iterator;
typedef boost::tokenizer<
boost::char_separator<char>,
char_iterator
> tokenizer;
std::cout<<"enter input text file name: ";
std::string in;
std::getline(std::cin,in);
std::ifstream ifs(in.c_str());
if(!ifs){
std::cout<<"can't open "<<in<<std::endl;
std::exit(EXIT_FAILURE);
}
/* Tokenize using space and common punctuaction as separators, and
* keeping the separators.
*/
tokenizer tok=tokenizer(
char_iterator(ifs),char_iterator(),
boost::char_separator<char>(
"",
"\t\n\r !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"));
text_container txt;
for(tokenizer::iterator it=tok.begin();it!=tok.end();++it){
txt.push_back(fw_string(*it));
}
std::cout<<"enter output serialization file name: ";
std::string out;
std::getline(std::cin,out);
std::ofstream ofs(out.c_str());
if(!ofs){
std::cout<<"can't open "<<out<<std::endl;
std::exit(EXIT_FAILURE);
}
boost::archive::text_oarchive oa(ofs);
oa<<const_cast<const text_container&>(txt);
}
/* Read a serialization archive and save the result to a text file. */
void load_serialization_file()
{
std::cout<<"enter input serialization file name: ";
std::string in;
std::getline(std::cin,in);
std::ifstream ifs(in.c_str());
if(!ifs){
std::cout<<"can't open "<<in<<std::endl;
std::exit(EXIT_FAILURE);
}
boost::archive::text_iarchive ia(ifs);
text_container txt;
ia>>txt;
std::cout<<"enter output text file name: ";
std::string out;
std::getline(std::cin,out);
std::ofstream ofs(out.c_str());
if(!ofs){
std::cout<<"can't open "<<out<<std::endl;
std::exit(EXIT_FAILURE);
}
std::copy(
txt.begin(),txt.end(),
std::ostream_iterator<std::string>(ofs));
}
int main()
{
try{
std::cout<<"1 load a text file and save it as a serialization file\n"
"2 load a serialization file and save it as a text file\n";
for(;;){
std::cout<<"select option, enter to exit: ";
std::string str;
std::getline(std::cin,str);
if(str.empty())break;
std::istringstream istr(str);
int option=-1;
istr>>option;
if(option==1)save_serialization_file();
else if(option==2)load_serialization_file();
}
}
catch(const std::exception& e){
std::cout<<"error: "<<e.what()<<std::endl;
std::exit(EXIT_FAILURE);
}
return 0;
}