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