| /* 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; |
| } |