猿问

设置标准流使用的内部缓冲区(pubsetbuf)

我正在编写一个需要将数据写入现有缓冲区的子程序,我想使用stringstream该类来简化数据的格式化。


最初,我使用以下代码将流的内容复制到缓冲区,但是希望避免这种解决方案,因为它复制了太多数据。


#include <sstream>

#include <algorithm>


void FillBuffer(char* buffer, unsigned int size)

{

    std::stringstream message;

    message << "Hello" << std::endl;

    message << "World!" << std::endl;


    std::string messageText(message.str());

    std::copy(messageText.begin(), messageText.end(), buffer);

}

这是我发现streambuf::pubsetbuf()方法的时候,简单地重写上面的代码如下。


#include <sstream>


void FillBuffer(char* buffer, unsigned int size)

{

    std::stringstream message;

    message.rdbuf()->pubsetbuf(buffer, size);


    message << "Hello" << std::endl;

    message << "World!" << std::endl;

}

不幸的是,这在Visual Studio 2008附带的C ++标准库实现下不起作用; buffer保持不变。


我看了一下它的实现,pubsetbuf结果发现它实际上“什么都不做”。


virtual _Myt *__CLR_OR_THIS_CALL setbuf(_Elem *, streamsize)

{   // offer buffer to external agent (do nothing)

    return (this);

}

这似乎是给定C ++标准库实现的限制。配置流以将其内容写入给定缓冲区的推荐方法是什么?


摇曳的蔷薇
浏览 982回答 3
3回答

慕桂英546537

在对这个问题进行了一些研究,并仔细审查了我的代码后,我发现了一个帖子,建议使用手工编写的std::streambuf类。这段代码背后的想法是创建一个streambuf初始化其内部结构以引用给定的缓冲区。代码如下。#include <streambuf>template <typename char_type>struct ostreambuf : public std::basic_streambuf<char_type, std::char_traits<char_type> >{&nbsp; &nbsp; ostreambuf(char_type* buffer, std::streamsize bufferLength)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; // set the "put" pointer the start of the buffer and record it's length.&nbsp; &nbsp; &nbsp; &nbsp; setp(buffer, buffer + bufferLength);&nbsp; &nbsp; }};现在,如果您查看我的原始代码,您会注意到我并不需要stringstream开头。我真正需要的只是一种使用IOStream库写入外部缓冲区的方法,并且std::ostream是解决此问题的更好的类型。顺便说一句,我怀疑这是怎么了array_sink从类型了Boost.Iostreams实现。这是使用我的ostreambuf类型的修改代码。#include <ostream>#include "ostreambuf.h"&nbsp; // file including ostreambuf struct from above.void FillBuffer(char* buffer, unsigned int size){&nbsp; &nbsp; ostreambuf<char> ostreamBuffer(buffer, size);&nbsp; &nbsp; std::ostream messageStream(&ostreamBuffer);&nbsp; &nbsp; messageStream << "Hello" << std::endl;&nbsp; &nbsp; messageStream << "World!" << std::endl;}
随时随地看视频慕课网APP
我要回答