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

C++實現(xiàn)的一個類ostringstream的類

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

        // 如果怕緩沖區(qū)不夠,先直接設(shè)置一下
        //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;


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

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

    //結(jié)果:
    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 緩沖區(qū)的遞增大小
    @param _ArrSize 內(nèi)部的字符數(shù)組的大小,當該字符數(shù)組容量不夠時,才new出真正的緩沖區(qū)
*/

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字節(jié)對齊

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


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

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;

    
// 構(gòu)造(析構(gòu))
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;
    }


    
/// 預定一個用戶設(shè)定的緩沖大小(對于大緩沖或已知大小的緩沖,用這種方法可以減少new/delete的次數(shù))
    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的數(shù)字處理,0-255的數(shù)字,需要轉(zhuǎn)換為short,int,long等進行處理

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


    
/// 導入數(shù)字
    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字節(jié)對齊
            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++技術(shù)

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

導航

統(tǒng)計

常用鏈接

留言簿(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>
            亚洲国产91| 国产欧美日韩在线视频| 免费在线亚洲欧美| 欧美亚洲综合久久| 亚洲综合三区| 亚洲一区区二区| 亚洲在线成人精品| 亚洲一区二区三区免费在线观看| 亚洲大胆美女视频| 1204国产成人精品视频| 国产精品乱人伦中文| 国产精品免费看片| 国产网站欧美日韩免费精品在线观看| 国产欧美日韩综合一区在线播放| 国产精品视频一| 国内外成人免费激情在线视频网站| 激情综合色丁香一区二区| 亚洲国产99| 亚洲深夜影院| 久久超碰97人人做人人爱| 久久久国产午夜精品| 欧美国产日产韩国视频| 亚洲欧洲免费视频| 亚洲宅男天堂在线观看无病毒| 亚洲欧美一级二级三级| 久久综合久久综合九色| 久久精品人人做人人爽| 国际精品欧美精品| 日韩视频免费观看高清完整版| 一区二区激情小说| 欧美午夜视频| 国产在线高清精品| 亚洲激情一区二区| 亚洲色图综合久久| 美女在线一区二区| 亚洲影视在线| 久热精品在线视频| 国产精品综合视频| 亚洲电影观看| 欧美在线二区| 亚洲国产欧美精品| 亚洲视频 欧洲视频| 免费成人性网站| 欧美三级特黄| 亚洲肉体裸体xxxx137| 久久精品国产清高在天天线| 亚洲精品永久免费| 麻豆freexxxx性91精品| 国产日韩欧美一区二区三区四区| 99国产精品久久久久久久| 久久蜜桃香蕉精品一区二区三区| 99热精品在线观看| 欧美激情久久久| 激情综合在线| 久久www免费人成看片高清| 妖精成人www高清在线观看| 女女同性女同一区二区三区91| 国产一区二区三区四区在线观看| 亚洲一区在线直播| 日韩亚洲国产精品| 欧美激情精品| 亚洲精品免费看| 免费观看国产成人| 久久九九全国免费精品观看| 国产精品视频不卡| 亚洲自拍高清| 亚洲一区二区高清视频| 欧美日韩亚洲三区| 欧美中文在线字幕| 欧美午夜寂寞影院| 夜夜嗨一区二区| 久久先锋资源| 久久亚洲精品欧美| 亚洲福利视频一区| 亚洲国产三级网| 欧美成人午夜免费视在线看片| 在线看欧美视频| 欧美风情在线观看| 欧美电影免费观看网站| 亚洲美女诱惑| 99伊人成综合| 国产精品一级久久久| 欧美综合二区| 久久久久久国产精品mv| 亚洲黄色影片| 最新国产成人av网站网址麻豆| 亚洲欧洲另类| 日韩一级大片在线| 国产精品久久久亚洲一区| 欧美一级夜夜爽| 久久久久国产精品人| 亚洲国产欧美国产综合一区| 91久久精品国产| 欧美午夜片在线观看| 久久xxxx| 欧美电影免费观看网站| 午夜精品久久久久影视| 久久九九精品| 一区二区三区四区五区视频| 亚洲欧美在线免费观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 免费看的黄色欧美网站| 欧美日韩麻豆| 久久三级视频| 欧美日韩国产美| 久久久综合网| 欧美美女福利视频| 久久综合九色欧美综合狠狠| 欧美日韩国产123| 久久免费视频在线观看| 欧美激情偷拍| 久久精品成人一区二区三区| 欧美激情精品久久久久久久变态| 亚洲午夜视频在线观看| 久久久久免费视频| 亚洲一区二区三区涩| 久久久久久久一区二区三区| 一区二区欧美日韩| 玖玖玖国产精品| 久久国产一区二区| 欧美视频在线观看免费| 亚洲国产91| 在线观看一区二区精品视频| 亚洲一区二区三区高清不卡| 久久久青草婷婷精品综合日韩| 一本色道久久综合一区| 美女主播视频一区| 欧美一区在线直播| 欧美日韩在线三区| 亚洲国产婷婷综合在线精品| 韩国成人福利片在线播放| 99亚洲精品| 中文国产成人精品久久一| 美女主播一区| 亚洲欧美卡通另类91av| 91久久综合| 久久精品一区二区三区不卡牛牛| 亚洲视频在线一区| 欧美日本一区二区三区 | 国产精品免费视频xxxx| av成人免费在线观看| 99精品视频一区二区三区| 欧美高清在线一区| 最近看过的日韩成人| 夜夜嗨av色一区二区不卡| 欧美成人首页| 亚洲国产日日夜夜| 亚洲免费观看高清在线观看 | 久久国产视频网站| 国产热re99久久6国产精品| 亚洲欧美在线一区| 久久亚洲视频| 一区二区三区在线不卡| 久久综合中文| aⅴ色国产欧美| 久久精品1区| 亚洲精品日韩激情在线电影| 欧美日韩国产999| 午夜精彩国产免费不卡不顿大片| 美女国产一区| 一区二区久久| 国产午夜精品理论片a级探花| 久久久久综合一区二区三区| 亚洲国产精品小视频| 亚洲伊人色欲综合网| 国产亚洲欧美一区二区| 欧美成人免费全部观看天天性色| 一本色道久久综合亚洲精品不卡 | 亚洲一区高清| 国产主播一区二区三区| 老巨人导航500精品| 最新成人在线| 篠田优中文在线播放第一区| 伊人久久婷婷| 欧美久久电影| 亚洲小说春色综合另类电影| 亚洲一区二区三区高清| 欧美成人免费在线| 亚洲美女在线观看| 国产欧美在线| 欧美一区二区三区日韩| 亚洲国产精品成人综合色在线婷婷| 欧美高清在线一区| 国内外成人在线| 欧美天天视频| 亚洲视频导航| 欧美在线综合视频| 欧美成人黑人xx视频免费观看| 亚洲一级网站| 欧美午夜精品理论片a级按摩| 亚洲精品乱码久久久久| 麻豆国产精品va在线观看不卡| 国产一区91| 久久天天躁狠狠躁夜夜av| 欧美成人黑人xx视频免费观看| 久久国产精品免费一区| 韩日精品视频一区| 久久久久综合一区二区三区| 亚洲毛片在线观看.| 亚洲国产成人高清精品|