青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++實現的一個類ostringstream的類

嫌ostringsteam過大,一些功能也不知道怎么用的,小生只好自己實現了一個功能類似的類,基本的常用的功能類似,只是為了我自己用起來更方便,更好駕馭,內置一個一級緩沖區(棧上,用戶可以定義大小),用戶可以定義緩沖區遞增的幅度。在知情(已知不會內存越界)的情況下可以直接對緩沖區進行寫入操作,代碼沒有針對char和wchar_t來做,當然也沒有考慮線程安全,有興趣的朋友可以自己修改。代碼在VC8下面通過,如果不是VC8的話,里面有幾個后面帶"_s"函數自己修改一下,如果有bug,請不吝賜教。

源代碼下載:http://m.shnenglu.com/Files/PeakGao/ostrbuf.rar

/**
    Created 2007.6.7 by PeakGao
    Email: peakgao163@163.com
*/


#ifndef __OSTRBUF_H__
#define __OSTRBUF_H__

#include 
<stdlib.h>

namespace base{

/*
    示例
    
    @code

    int dosomething(char* dest_buf, int max_size)
    {
        char buf[] = "some thing some thing some thing some thing ";
        int actualCpySize = max_size / 2 + 1;
        memcpy(dest_buf, buf, actualCpySize);
        return actualCpySize;
    }

    void test_ostrbuf()
    {
        ostrbuf osb;

        // 如果怕緩沖區不夠,先直接設置一下
        //osb.reserve(1024);

        // 這些操作類似ostream的功能
        osb<<(uint)0xffffffff<<","<<(int)0x80000001<<endl;// endl即換行符
        osb<<99<<","<<(short)14<<","<<-15<<endl;
        osb<<(int64)0x8000000000000001<<","<<(uint64)0xffffffffffffffff<<endl;
        osb<<15.1367891024f<<","<<9999.123456789<<endl;

         // 將一個字符串的子串寫入
        osb<<ostrbuf::substr("我們你們他們abcdefg", 12)<<endl;

        // 定制的格式化
        osb<<ostrbuf::formatf("%02.6f", 3.1415926f)<<endl;
        osb<<_fi("%04d", 25)<<endl; // 這種寫法更簡潔
        osb<<_fi("%X", 255)<<endl;


        // 直接操作緩沖區示例(在不知情的情況下不推薦這樣操作,知情的情況下,也不錯,很方便,至少少了字符串拷貝操作)
        osb.grow(64);    // 可能需要128字節空間,這個數值必須正確才能防止緩存越界
        int off = dosomething(osb.cur(), 64); // dosomething 已經完全拋開了 ostrbuf 類,不受任何拘束,危險!
        osb.seek(off);    // 手動將位置seek到正確位置
        osb<<ends;        // 因上面的 dosomething 沒有在緩沖區最后加入'\0',這里不能忘記,除了像 dosomething 這樣直接對緩沖區進行寫外,其他的操作都會自動加'\0'

        std::cout<<osb.c_str();
    }

    //結果:
    4294967295,-2147483647
    99,14,-15
    -9223372036854775807,18446744073709551615
    15.136789,9999.123457
    我們你們他們
    3.141593
    0025
    FF
    some thing some thing some thing 

    @endcode
*/


/**
    字符串輸出緩沖,功能類似ostream,但更加簡潔

    @param _GrowBytes 緩沖區的遞增大小
    @param _ArrSize 內部的字符數組的大小,當該字符數組容量不夠時,才new出真正的緩沖區
*/

template 
<int _GrowBytes, int _ArrSize = 64>
class basic_ostrbuf
{
private:
    
enum {_MyGrowBytes = _GrowBytes > 0 ? ((_GrowBytes + 7& ~7) : 256};
    
enum {_MyArrSize = _ArrSize > 0 ? ((_ArrSize + 7& ~7) : 64};
    
enum {_LongMaxLength = 16, _Int64MaxLength = 24, _DoubleMaxLength = 48}// 留有余地,8字節對齊

    
char*    _buf;                /// 緩沖區
    size_t    _pos;                /// 當前寫入位置
    size_t    _cap;                /// 緩沖區容量
    char    _arr[_MyArrSize];    /// 字符數組,當操作小緩沖區時,可以利用他,這樣就沒必要new內存


    
/// 用于用戶自定義的格式化,基于sprintf函數的格式化功能

public:
    template
<class T>
    
struct format 
    
{
        
const char* _f;
        T _v;
        format(
const char* f, const T& v) : _f(f), _v(v) { }
    }
;

    typedef format
<float>                    formatf;
    typedef format
<double>                    formatd;
    typedef format
<int>                        formati;
    typedef format
<__int64>                    formati64;
    typedef std::pair
<const char*, size_t>    substr;

    
// 構造(析構)
public:
    basic_ostrbuf() : _buf(_arr), _pos(
0), _cap(_MyArrSize) { _arr[0= 0; }
    
~basic_ostrbuf() if (_buf != _arr) delete[] _buf; }

    
// 基本方法
public:
    
void clear()
    
{
        grow(
1);
        _pos 
= 0;
        _buf[_pos] 
= 0;
    }


    
char* str() const                return _buf; }
    
const char* c_str() const        return _buf; }
    size_t length() 
const            return _pos; }
    size_t capacity() 
const            return _cap; }
    
char* cur() const                return _buf + _pos;}
    
void seek(int offset)
    
{
        
int new_pos = (int)_pos + offset;
        
if (new_pos >= (int)_cap) new_pos = (int)_cap - 1;
        
if (new_pos < 0) new_pos = 0;
        _pos 
= (size_t)new_pos;
    }


    
/// 預定一個用戶設定的緩沖大小(對于大緩沖或已知大小的緩沖,用這種方法可以減少new/delete的次數)
    void reserve(size_t length)
    
{
        
if (length >= _cap)
            grow(length 
- _pos);
    }


    
// operator<<
public:
    
/// 用于endl和ends
    basic_ostrbuf& operator<<(basic_ostrbuf& (__cdecl * fn)(basic_ostrbuf&)) 
    
{
        
return ((*fn)(*this));
    }


    
/// 輸入另一個對象
    basic_ostrbuf& operator<<(const basic_ostrbuf& other)
    
{
        
return push(other.c_str(), other.length());
    }



    
/// 輸入字符串
    basic_ostrbuf& operator<<(const char* str)
    
{
        
return (str ? push(str, strlen(str)) : (*this));
    }

    
/// 輸入一個子串
    basic_ostrbuf& operator<<(const substr& str)
    
{
        
return push(str.first, str.second);
    }

    
/// 輸入std::string對象
    basic_ostrbuf& operator<<(const std::string& str)
    
{
        
return push(str.c_str(), str.length());
    }

    
/// 輸入一個字符
    
/// 注:這里c當字符處理,不當0-255的數字處理,0-255的數字,需要轉換為short,int,long等進行處理

    basic_ostrbuf& operator<<(char c)
    
{
        
return put(c);
    }


    
/// 導入數字
    basic_ostrbuf& operator<<(short int si)
    
{
        
return operator<<(long(si));
    }

    basic_ostrbuf
& operator<<(unsigned short int usi)
    
{
        
return operator<<(unsigned long(usi));
    }

    basic_ostrbuf
& operator<<(int i)
    
{
#ifdef INT_64_BITS
        
return operator<<(__int64(i));
#else
        
return operator<<(long(i));
#endif
    }

    basic_ostrbuf
& operator<<(unsigned int ui)
    
{
#ifdef INT_64_BITS
        
return operator<<(unsigned __int64(ui));
#else
        
return operator<<(unsigned long(ui));
#endif
    }

    basic_ostrbuf
& operator<<(long l)
    
{
        grow(_LongMaxLength);
        _ltoa_s(l, cur(), _LongMaxLength, 
10);
        _pos 
+= strlen(cur());
        
return (*this);
    }

    basic_ostrbuf
& operator<<(unsigned long ul)
    
{
        grow(_LongMaxLength);
        _ultoa_s(ul, cur(), _LongMaxLength, 
10);
        _pos 
+= strlen(cur());
        
return (*this);
    }

    basic_ostrbuf
& operator<<(__int64 i64)
    
{
        grow(_Int64MaxLength);
        _i64toa_s(i64, cur(), _Int64MaxLength, 
10);
        _pos 
+= strlen(cur());
        
return (*this);
    }

    basic_ostrbuf
& operator<<(unsigned __int64 ui64)
    
{
        grow(_Int64MaxLength);
        _ui64toa_s(ui64, cur(), _Int64MaxLength, 
10);
        _pos 
+= strlen(cur());
        
return (*this);
    }

    basic_ostrbuf
& operator<<(float f)
    
{
        grow(_DoubleMaxLength);
        sprintf_s(cur(), _DoubleMaxLength, 
"%f", f);
        _pos 
+= strlen(cur());
        
return (*this);
    }

    basic_ostrbuf
& operator<<(double d)
    
{
        grow(_DoubleMaxLength);
        sprintf_s(cur(), _DoubleMaxLength, 
"%f", d);
        _pos 
+= strlen(cur());
        
return (*this);
    }


    
/// 定制的格式化
    template<class T>
    basic_ostrbuf
& operator<<(const format<T>& val)
    
{
        grow(_DoubleMaxLength);
        sprintf_s(cur(), _DoubleMaxLength, val._f, val._v);
        _pos 
+= strlen(cur());
        
return (*this);
    }

public:
    
void grow(size_t len)
    
{
        
if (_pos + len >= _cap)
        
{
            
// 計算新的尺寸,并8字節對齊
            size_t new_size = _pos + len + 1;
            size_t new_cap 
= _cap ? _cap : _MyGrowBytes;
            
while (new_cap < new_size)
                new_cap 
+= _MyGrowBytes;
            new_cap 
= (new_cap + 7& ~7;

            
char* new_buf = new char[new_cap];
            
if (_pos > 0)
            
{
                memcpy(new_buf, _buf, _pos 
+ 1);
                
if (_buf != _arr)
                    delete[] _buf;
            }

            
else
                new_buf[
0= 0;

            _buf 
= new_buf;
            _cap 
= new_cap;
        }

    }

    basic_ostrbuf
& put(char c)
    
{
        grow(
1);
        _buf[_pos] 
= c;
        
if (c != 0)
            _buf[
++_pos] = 0;
        
return (*this);
    }

    basic_ostrbuf
& push(const char* str, size_t len)
    
{
        
if (str && len > 0)
        
{
            grow(len);
            memcpy(_buf 
+ _pos, str, len);
            _buf[_pos 
+= len] = 0;
        }

        
return (*this);
    }

}
;



/// 字符串終止
template<int _GrowBytes, int _ArrSize>
inline basic_ostrbuf
<_GrowBytes, _ArrSize>& _cdecl ends(basic_ostrbuf<_GrowBytes, _ArrSize>& osb)
{
    
return osb.put('\0');
}


/// 換行
template<int _GrowBytes, int _ArrSize>
inline basic_ostrbuf
<_GrowBytes, _ArrSize>& _cdecl endl(basic_ostrbuf<_GrowBytes, _ArrSize>& osb)
{
    
return osb.put('\n');
}


#if 0
/*
    示例:用戶自定義類型的定制方法,定義后可以這樣處理你的自定義類型:
    YourType  yt;
    ostrbuf<<yt;
*/

template
<int _GrowBytes, int _ArrSize>
inline basic_ostrbuf
<_GrowBytes, _ArrSize>& _cdecl operator<<(basic_ostrbuf<_GrowBytes, _ArrSize>& osb, const YourType& val)
{
    
if (val.c_str())
        osb.push(val.c_str(), val.length());
    
return osb;
}

#endif


typedef basic_ostrbuf
<25664>        ostrbuf;


// 為了方便使用,作這樣的 typedef
typedef ostrbuf::formatf    _ff;
typedef ostrbuf::formatd    _fd;
typedef ostrbuf::formati    _fi;
typedef ostrbuf::formati64    _fi64;
typedef ostrbuf::substr        _ss;

}
 // namespace

#endif // __OSTRBUF_H__

posted on 2007-06-07 16:30 PeakGao 閱讀(2278) 評論(0)  編輯 收藏 引用 所屬分類: C++技術

<2007年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

導航

統計

常用鏈接

留言簿(9)

隨筆分類(67)

隨筆檔案(65)

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧洲一区二区在线观看 | 欧美一区二区精品久久911| 亚洲午夜一区二区三区| 鲁大师成人一区二区三区| 国产婷婷色综合av蜜臀av| 亚洲视频香蕉人妖| 欧美激情一区在线| 久久久久成人精品| 国产欧美日韩视频| 亚洲欧美另类国产| 在线亚洲国产精品网站| 欧美激情精品久久久久久蜜臀 | 欧美性猛交xxxx乱大交蜜桃| 亚洲九九精品| 亚洲欧洲免费视频| 欧美精品久久久久久久久久| 亚洲狼人综合| 亚洲精品久久久一区二区三区| 狼人社综合社区| 最新成人在线| 亚洲精品极品| 国产精品你懂得| 久久精品一区蜜桃臀影院| 久久99伊人| 亚洲国产欧美一区二区三区丁香婷| 欧美国内亚洲| 欧美巨乳在线观看| 亚洲男女自偷自拍图片另类| 亚洲免费一在线| 激情欧美一区| 亚洲精品1234| 国产精品美女久久久久aⅴ国产馆| 欧美亚洲视频在线观看| 久久精品视频亚洲| 亚洲精选在线观看| 亚洲网友自拍| 永久555www成人免费| 亚洲国产综合视频在线观看| 欧美性一区二区| 久久久最新网址| 欧美日本精品| 久久久www成人免费无遮挡大片| 久久一区二区三区四区五区| 宅男噜噜噜66一区二区66| 亚洲一区二区三区在线| 永久免费精品影视网站| 亚洲美女淫视频| 国产欧美一二三区| 亚洲国产专区| 狠狠色丁香久久综合频道| 亚洲国产日韩一区二区| 国产精品久久久久av免费| 欧美一区二区三区久久精品| 免费在线欧美视频| 欧美在线一区二区| 欧美黄色成人网| 久久一区二区三区国产精品| 欧美日韩精品在线| 久久中文在线| 久久婷婷综合激情| 日韩亚洲视频在线| 激情91久久| 亚洲视频免费在线| 亚洲精品日韩精品| 欧美一区二区免费观在线| 亚洲狼人精品一区二区三区| 久久av一区二区| 午夜一区二区三视频在线观看| 欧美国产日产韩国视频| 久久免费99精品久久久久久| 国产精品美女久久| 99re视频这里只有精品| 亚洲国产综合视频在线观看| 久久xxxx| 久久精品视频99| 国产精品亚洲精品| 一区二区激情| 亚洲少妇自拍| 欧美日本在线| 亚洲欧洲日产国产网站| 精品二区视频| 欧美一区二区视频97| 欧美一级片一区| 国产精品视频免费观看| 这里只有精品丝袜| 亚洲手机成人高清视频| 欧美日韩综合视频网址| 日韩香蕉视频| 亚洲图片你懂的| 欧美日韩美女在线| 亚洲精品美女久久久久| 亚洲免费精品| 欧美日韩一区二区在线观看| 一区二区三欧美| 性做久久久久久| 国产精品日韩欧美一区二区| 亚洲一区精品电影| 欧美一级一区| 国产亚洲一区二区三区在线观看 | 最新日韩在线视频| 日韩一区二区免费看| 欧美久久久久久久| 夜夜嗨av一区二区三区网站四季av| 一区二区免费在线观看| 欧美视频一区在线| 亚洲一级在线观看| 久久精品欧美日韩| 在线观看日韩www视频免费 | 国产亚洲精品久久飘花| 久久9热精品视频| 欧美国产精品va在线观看| 亚洲精品综合在线| 国产精品久久久久99| 欧美一区中文字幕| 亚洲国产精品成人久久综合一区| 日韩午夜视频在线观看| 国产精品二区影院| 欧美在线日韩在线| 亚洲第一视频网站| 亚洲欧美经典视频| 亚洲大黄网站| 国产精品第三页| 免费在线一区二区| 欧美精品免费视频| 亚洲视频导航| 玖玖玖国产精品| 99精品国产在热久久| 国产精品私拍pans大尺度在线 | 性欧美xxxx大乳国产app| 久久久一区二区三区| 亚洲激情网站免费观看| 国产精品任我爽爆在线播放| 久久国产乱子精品免费女| 亚洲黄色三级| 久久精品视频导航| 亚洲小说欧美另类社区| 国产视频一区二区三区在线观看| 久久久国产成人精品| 日韩网站在线| 你懂的网址国产 欧美| 亚洲男女自偷自拍| 亚洲美女尤物影院| 一区在线免费| 国产酒店精品激情| 欧美日韩国产一级| 六月天综合网| 久久av二区| 午夜精品久久久久久99热软件| 亚洲精品国产精品国产自| 美女爽到呻吟久久久久| 性欧美video另类hd性玩具| 日韩视频在线免费观看| 亚洲福利视频专区| 国产有码一区二区| 国产农村妇女精品一二区| 欧美日韩在线视频观看| 欧美成人免费全部观看天天性色| 欧美一区二区三区啪啪| 亚洲视频一区二区| 亚洲三级视频| 亚洲日韩视频| 亚洲精品美女| 亚洲免费成人av| 亚洲欧洲一级| 亚洲国产精品999| 欧美大胆成人| 久久视频免费观看| 久久精品亚洲乱码伦伦中文| 午夜精品久久久久久久99黑人| 中文国产成人精品| 99在线热播精品免费99热| 亚洲人成久久| 亚洲精品国产精品国自产观看| 亚洲国产成人精品女人久久久| 狠狠色伊人亚洲综合成人| 国产一区二区在线观看免费| 国产一区二区精品丝袜| 国产色产综合产在线视频| 国产伦精品一区二区三区四区免费 | 一区二区av在线| 亚洲无玛一区| 亚洲在线视频观看| 午夜久久影院| 久久成人免费网| 久久久久国产一区二区| 麻豆freexxxx性91精品| 欧美精品在线观看| 欧美日韩中文字幕| 国产欧美精品久久| 亚洲成色777777在线观看影院| 1024欧美极品| 亚洲美女av网站| 亚洲欧美日韩中文播放| 久久av红桃一区二区小说| 国内精品久久久久国产盗摄免费观看完整版| 欧美电影在线| 国产精品久久二区二区| 国产亚洲精品久久久久婷婷瑜伽| 亚洲第一黄色| 亚洲天堂av图片|