134 lines
3.5 KiB
C++
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;
|
|
}
|