• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            清風(fēng)竹林

            ぷ雪飄絳梅映殘紅
               ぷ花舞霜飛映蒼松
                 ----- Do more,suffer less

            datastream, C++數(shù)據(jù)序列化與反序列化容器

              其實(shí)本來不想自己寫這樣一個(gè)類的,但找來找去都沒有找到符合生活習(xí)慣的,于是在經(jīng)過反復(fù)的推敲設(shè)計(jì)后,嗚,我終于承認(rèn)自己功力不夠---無法將內(nèi)存管理與迭代器完美地結(jié)合在一起,只好只好先用std::vector了,于是便有了下面的代碼。到目前為止還不能號(hào)稱功能完善,但,但應(yīng)該基本可用了,堪堪記在這里,也許能給以后的自己一些幫助,或可得到高手指點(diǎn)一二:
              類文件被保存為datastream.hpp
            #pragma once
            /********************************************************************
            created:    2008-10-13
            author:        lixianmin

            purpose:    used for data serialization and deserialization
            Copyright (C) 2008 - All Rights Reserved
            ********************************************************************
            */
            #include 
            <vector>
            #include 
            <cassert>
            class datastream:public std::vector<char>
            {
            public:
                datastream
            & operator<<(bool data){return push(data);}
                datastream
            & operator<<(char data){return push(data);}
                datastream
            & operator<<(wchar_t data){return push(data);}
                datastream
            & operator<<(short data){return push(data);}
                datastream
            & operator<<(int data){return push(data);}
                datastream
            & operator<<(long data){return push(data);}
                datastream
            & operator<<(float data){return push(data);}
                datastream
            & operator<<(double data){return push(data);}
                datastream
            & operator<<(unsigned char data){return push(data);}    
                datastream
            & operator<<(unsigned short data){return push(data);}    
                datastream
            & operator<<(unsigned int data){return push(data);}
                datastream
            & operator<<(unsigned long data){return push(data);}

                datastream
            & operator>>(bool& data){return pop(data);}
                datastream
            & operator>>(char& data){return pop(data);}
                datastream
            & operator>>(wchar_t& data){return pop(data);}
                datastream
            & operator>>(short& data){return pop(data);}
                datastream
            & operator>>(int& data){return pop(data);}
                datastream
            & operator>>(long& data){return pop(data);}
                datastream
            & operator>>(float& data){return pop(data);}
                datastream
            & operator>>(double& data){return pop(data);}
                datastream
            & operator>>(unsigned char& data){return pop(data);}    
                datastream
            & operator>>(unsigned short& data){return pop(data);}    
                datastream
            & operator>>(unsigned int& data){return pop(data);}
                datastream
            & operator>>(unsigned long& data){return pop(data);}

                datastream
            & test(bool& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(char& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(short& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(int& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(long& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(float& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(double& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(unsigned char& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(unsigned short& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(unsigned int& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}
                datastream
            & test(unsigned long& data){memcpy(&data, &operator[](0), sizeof(data));return *this;}    

                
            //std::string處理
                datastream& operator<<(const char* data){return push(strlen(data), (void*)data);}
                datastream
            & operator<<(const wchar_t* data){return push(wcslen(data)<<1, (void*)data);}
                datastream
            & operator<<(const std::string& data){return push(data.size(), (void*)data.c_str());}    
                datastream
            & operator<<(const std::wstring& data){return push(data.size()<<1, (void*)data.c_str());}
                datastream
            & operator>>(std::string& data)
                {
                    size_t nSize;
                    pop(nSize);
                    std::vector
            <char>::iterator first=begin(), last=first+nSize;
                    data.assign(first, last);
                    erase(first, last);
                    
            return *this;
                }
                datastream
            & operator>>(std::wstring& data)
                {
                    size_t nSize;
                    pop(nSize);
                    wchar_t
            * a=(wchar_t*)&operator[](0), *b=a+(nSize>>1);
                    data.assign(a, b);
                    std::vector
            <char>::iterator first=begin();    
                    erase(first, first
            +nSize);
                    
            return *this;
                }
                datastream
            & test(std::string& data)
                {
                    size_t nSize;
                    test(nSize);
                    std::vector
            <char>::iterator first=begin()+sizeof(nSize);
                    data.assign(first, first
            +nSize);
                    
            return *this;
                }
                datastream
            & test(std::wstring& data)
                {
                    size_t nSize;
                    test(nSize);
                    wchar_t
            * first=(wchar_t*)&operator[](sizeof(nSize));
                    data.assign(first, first
            +(nSize>>1));
                    
            return *this;
                }
                
            //std::vector處理
                template<typename C>
                datastream
            & operator<<(const std::vector<C>& data)
                {
                    size_t nSize
            =data.size();
                    push(nSize);
                    
            for (int i=0; i<nSize; ++i)
                    {
                        
            operator<<(data[i]);
                    }
                    
            return *this;
                }
                template
            <typename C>
                datastream
            & operator>>(std::vector<C>& data)
                {
                    size_t nSize;
                    pop(nSize);
                    C tmp;
                    
            for (int i=0; i<nSize; ++i)
                    {
                        
            operator>>(tmp);
                        data.push_back(tmp);
                    }            
                    
            return *this;
                }
            private:
                
            char* inc_size(size_t delta_size)
                {
                    size_t last_size
            =size();
                    resize(last_size
            +delta_size);
                    
            return &operator[](last_size);
                }
                template
            <typename C>
                datastream
            & push(C data)
                {
                    memcpy(inc_size(
            sizeof(data)), &data, sizeof(data));
                    
            return *this;
                }
                datastream
            & push(size_t size, void* data)
                {
                    push(size);
                    memcpy(inc_size(size), data, size);
                    
            return *this;
                }
                template
            <typename C>
                datastream
            & pop(C& data)
                {
                    memcpy(
            &data, &operator[](0), sizeof(data));
                    erase(begin(), begin()
            +sizeof(data));
                    
            return *this;
                }
            };
              測試代碼:
            #include <iostream>
            #include 
            <fstream>
            #include 
            <iterator>
            #include 
            "datastream.hpp"

            template
            <typename T>
            void print_vector(const std::vector<T>& v)
            {
                std::cout
            <<"---------------------------Print Vector---------------------------"<<std::endl;
                std::copy(v.begin(), v.end(), std::ostream_iterator
            <T>(std::cout, "\n"));
                std::cout
            <<"-------------------------Print Vector End-------------------------"<<std::endl;
            }
            int main(int argc, char* argv[])
            {
                std::
            string strPath="c:\\abc.txt";

                std::vector
            <std::string> v;
                v.push_back(
            "hello world");
                v.push_back(
            "向量測試");
                
                datastream ds;
                ds
            <<318<<3.14159<<"hello world"<<std::string("中文測試")<<v;

                std::ofstream outfile(strPath.c_str());
                
            if (outfile)
                {
                    std::copy(ds.begin(), ds.end(), std::ostreambuf_iterator
            <char>(outfile));
                    outfile.close();
                    std::cout
            <<"write to file successfully!"<<std::endl;
                }
                
                ds.clear();                            
            //清空數(shù)據(jù)(但不釋放ds的內(nèi)存)
                std::ifstream infile(strPath.c_str());
                
            if (infile)
                {
                    ds.assign(std::istreambuf_iterator
            <char>(infile), std::istreambuf_iterator<char>());    //別忘了std::vector有個(gè)assign函數(shù)
                    int a;
                    
            double b;
                    std::
            string c, d;
                    std::vector
            <std::string> v2;
                    ds
            >>a>>b>>c>>d>>v2;
                    datastream(ds).swap(ds);        
            //釋放datastream內(nèi)存
                    std::cout<<"a="<<a<<", b="<<b<<", c="<<c<<", d="<<d<<std::endl;
                    print_vector(v2);
                }
                system(
            "pause");
                
            return 0;
            }
              輸出:
            write to file successfully!
            a=318, b=3.14159, c=hello world, d=中文測試
            ---------------------------Print Vector---------------------------
            hello world
            向量測試
            -------------------------Print Vector End-------------------------
            請(qǐng)按任意鍵繼續(xù). . .








            posted on 2008-10-15 14:55 李現(xiàn)民 閱讀(1758) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 語法試煉

            国产精品久久久久免费a∨| 国产情侣久久久久aⅴ免费| 久久亚洲sm情趣捆绑调教| 久久综合九色欧美综合狠狠| 久久久久免费精品国产| 精品久久久久久国产三级| 亚洲午夜精品久久久久久app| 狠狠色丁香婷婷综合久久来来去| 久久精品一区二区三区不卡| 亚洲国产精品无码久久久久久曰| 久久九九兔免费精品6| 国产精品激情综合久久| 波多野结衣AV无码久久一区| 久久亚洲高清观看| 久久精品午夜一区二区福利| 欧美激情精品久久久久久久| 久久无码专区国产精品发布| 久久久久国产精品三级网| 久久精品国产亚洲av高清漫画| 久久精品无码一区二区三区日韩| 少妇久久久久久久久久| 国产精品久久久久jk制服| 久久青青草原精品国产| 亚洲熟妇无码另类久久久| 久久精品国产亚洲av麻豆蜜芽| 国产精品亚洲综合专区片高清久久久| 精品999久久久久久中文字幕| 亚洲日韩中文无码久久| 国产成年无码久久久久毛片| 久久久久免费看成人影片| 国产精品禁18久久久夂久| 久久香蕉综合色一综合色88| 久久伊人中文无码| 久久久一本精品99久久精品88| 精品久久久久久无码中文字幕一区| MM131亚洲国产美女久久| 婷婷久久综合| 中文精品久久久久国产网址| 亚洲Av无码国产情品久久| 久久男人Av资源网站无码软件| www亚洲欲色成人久久精品|