我一直在研究创建我自己的ostream以及一个streambuf来处理我的ostream的缓冲区.我实际上大部分工作,我可以插入(<<)到我的流并获得字符串没有问题.我通过虚拟函数xsputn来实现这一点.但是,如果我向流输入(<<<&)一个浮点数或int而不是字符串xsputn永远不会被调用. 我已经遍历了代码,我看到流正在调用do_put,然后是f_put,它最终会尝试将float 1字符一次放入缓冲区.我可以让它调用我的虚函数溢出(int c)的实现,如果我让我的缓冲区没有空间,从而得到浮点数和int的数据. 现在问题就在这里,我需要知道何时将float放入缓冲区.换句话说,我需要知道这是什么时候最后一次溢出将被调用为特定值流入.xsputn对我有用的原因是因为我得到了整个值及其长度.所以我可以将它复制到缓冲区然后调用等待缓冲区已满的函数. 我无可否认地滥用ostream设计,因为我需要缓存输出,然后对每个输入值(<<<<<<<<<<<<<< 无论如何要清楚我会用另一种方式重述我正在拍摄的内容.我很有可能以错误的方式解决这个问题. 我想使用一个继承的ostream和streambuf所以我可以输入值并允许它为我处理我的类型转换,然后我想将这些信息传递给另一个我将句柄传递给streambuf的对象(对于?).该对象有昂贵的i / o所以我不想一次发送数据1个字符. 如果不清楚,请提前抱歉.谢谢你的时间.

解决方法

虽然听起来很粗糙,但你所做的并不太清楚
对.只是为了确定:你所有的ostream都提供了
方便构造者来创建和安装你的streambuf,
析构函数,可能还有rdbuf的实现
处理正确类型的缓冲区.假设这是真的:
在streambuf中定义xsputn纯粹是一种优化.
您必须定义的关键功能是溢出.最简单的
溢出的实现只需要一个字符,并且
将其输出到接收器.除此之外的一切都是优化:
例如,您可以使用setp设置缓冲区;如果你这样做
这样,只有缓冲区才会调用溢出
已满,或请求同花.在这种情况下,你必须
输出缓冲区也是如此(使用pbase和pptr来获取
地址). (streambuf基类初始化了
指针创建一个0长度缓冲区,所以溢出将是
呼唤每个角色.)你可能会做的其他功能
想要覆盖(非常)特定情况:

imbue:如果由于某种原因需要语言环境. (记住这一点
当前字符编码是语言环境的一部分.)

setbuf:允许客户端代码指定缓冲区. (恕我直言,是的
通常不值得打扰,但你可能有特殊之处
要求.)

寻求:寻求支持.我从来没有在任何一个中使用过它
我的streambufs,所以我不能提供任何超出的信息
你可以阅读标准.

同步:在刷新时调用,应输出中的任何字符
缓冲到水槽.如果你从不打电话给setp(所以没有
缓冲区),你总是在同步,这可能是一个无操作.
overflow或uflow可以调用这个,或者两者都可以调用一些
单独的功能. (关于同步之间的唯一区别
而uflow是只有在有uflow时才会被调用
一个缓冲区,如果缓冲区为空,它将永远不会被调用.
如果客户端代码刷新流,则将调用sync.)

在编写自己的流时,除非性能指示
否则,我会保持简单,只覆盖溢出.
如果性能指示缓冲区,我通常会将代码放入
将缓冲区刷新为单独的写入(地址,长度)
功能,并实现溢出和同步沿线
的:

int MyStreambuf::overflow( int ch )
{
    if ( pbase() == NULL ) {
        // save one char for next overflow:
        setp( buffer,buffer + bufferSize - 1 );
        if ( ch != EOF ) {
            ch = sputc( ch );
        } else {
            ch = 0;
        }
    } else {
        char* end = pptr();
        if ( ch != EOF ) {
            *end ++ = ch;
        }
        if ( write( pbase(),end - pbase() ) == Failed ) {
            ch = EOF;
        } else if ( ch == EOF ) {
            ch = 0;
        }
        setp( buffer,buffer + bufferSize - 1 );
    }
    return ch;
}

int sync()
{
    return (pptr() == pbase()
            || write( pbase(),pptr() - pbase() ) != Failed)
        ? 0
        : -1;
}

一般来说,我不会打扰xsputn,但如果你的客户端
代码输出了很多长字符串,它可能很有用.
像这样的东西应该做的伎俩:

streamsize xsputn(char const* p,streamsize n)
{
    streamsize results = 0;
    if ( pptr() == pbase()
            || write( pbase(),pptr() - pbase() ) != Failed ) {
        if ( write(p,n) != Failed ) {
            results = n;
        }
    }
    setp( buffer,buffer + bufferSize - 1 );
    return results;
}

c – 使用xsputn和overflow继承ostream和streambuf问题的更多相关文章

  1. ios – x轴的webkit溢出滚动问题?

    我有一个可滚动的div与以下css:但是在iOS设备上,当div内部的内容比div本身宽时,启用x轴滚动.如何禁用x轴滚动?解决方法我一直有同样的问题,似乎不幸的是-webkit-overflow-scrolling没有x/y选项.我通常使用的解决方法是将滚动div包装在overflow-x:hiddendiv中,问题应该解决.标记:造型:

  2. Swift - 文件,文件夹操作大全

    ios开发经常会遇到读文件,写文件等,对文件和文件夹的操作,这时就可以使用NSFileManager,NSFileHandle等类来实现。)//contentsOfPath:Optionalprint//类似上面的,对指定路径执行浅搜索,返回指定目录路径下的文件、子目录及符号链接的列表contentsOfURL=try?important;font-family:Consolas,options:NSDirectoryEnumerationoptionsSkipsHiddenFiles);//conten

  3. Swift - 使用表格组件UITableView实现单列表

    2,效果图3,单元格复用机制:由于普通的表格视图中对的单元格形式一般都是相同的,所以本例采用了单元格复用机制,可以大大提高程序性能。实现方式是初始化创建UITableView实例时使用registerClass创建一个可供重用的UITableViewCell。并将其注册到UITableView,ID为SwiftCell。下次碰到形式(或结构)相同的单元就可以直接使用UITableView的dequeueReusableCellWithIdentifier方法从UITableView中取出。.dataSou

  4. Swift - 使用表格组件UITableView实现分组列表

    1,样例说明:列表以分组的形式展示同时还自定义分区的头部和尾部点击列表项会弹出消息框显示该项信息。overridefuncloadView(){super.loadView()}viewDidLoad(){.viewDidLoad()//初始化数据,这一次数据,我们放在属性列表文件里self.allnames=[0:[String](["UILabel标签"ottom:auto!important;font-family:Consolas,"UITableView表格视图"])];print.adHead

  5. Swift - 给表格的单元格UITableViewCell添加图片,详细文本标签

    表格UITableView中,每一单元格都是一个UITableViewCell。其支持简单的自定义,比如在单元格的内部,添加图片和详细文本标签。注意UITableViewCell的style:UITableViewCellStyle.Default:默认的,只有一个常规内容标签和一个可选的UIImageViewUITableViewCellStyle.Value1:内容标签在左,详细标签在右,右边是蓝色或灰色的文本UITableViewCellStyle.Value2:同Value1位置相同,左边是蓝色文

  6. Swift - 给表格添加编辑功能删除,插入

    overridefuncloadView(){super.loadView()}viewDidLoad(){.viewDidLoad()//初始化数据,这一次数据,我们放在属性列表文件里self.allnames=[0:[](["UILabel标签"ottom:auto!important;font-family:Consolas,"UITableView表格视图"])];print.adHeaders=["常见UIKit控件"ottom:auto!important;font-family:Consol

  7. Swift - 使用导航条和导航条控制器来进行页面切换

    下面通过一个简单“组件效果演示”的小例子来说明如何通过代码来进行页面的切换。)->Bool{//把起始ViewController作为导航控件封装,我们在ViewController里就能调用导航条进行页面切换了letrootViewController=ViewController()letrootNavigationController=UINavigationControllerself.window!.rootViewController=rootNavigationControllerretur

  8. Swift - 使用UIWebView和UIToolbar制作一个浏览器

    //进度条计时器ptimer:NSTimer!overridefuncviewDidLoad(){super.viewDidLoad()//Doanyadditionalsetupafterloadingtheview,typicallyfromanib.self.webview.delegate=;loadindicator=;loadindicator.activityIndicatorViewStyle=UIActivityIndicatorViewStyle.Gray.view.addSubvie

  9. Swift - 炫酷放射弹出按钮菜单改造自AwesomeMenu

    ,highlightedImage:storyMenuItemImagepressed!,contentimage:starImage!,highlightedContentimage:nil)starMenuItem2=ottom:auto!important;float:none!important;height:auto!important;left:auto!important;line-height:1.5em!important;margin:0px!important;overflow:vi

  10. Swift - 生成各种控件的工厂类包含标签,按钮,输入框等

    在iOS开发中,页面里有时会大量的用到一些控件,如果要一个个单独创建再设置样式的话就显得很麻烦。我们可以创建一个生成各种控件的工厂类,这样在需要的时候调用下就可以了。下面以一个自定义的工厂类为例,其中提供了文本标签,按钮,文本输入框,分段单选控件的生成,效果图如下:工厂类:ViewFactory.swift12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部