【问题标题】:Fill a buffer with iostream operator使用 iostream 运算符填充缓冲区
【发布时间】:2013-06-12 22:13:10
【问题描述】:

我想使用<< 操作符来填充外部缓冲区,

我尝试从iostream 继承,然后每次我将<< 用于我的类时,我都会将内容复制到当前缓冲区位置,并增加缓冲区位置...

我没有运气,我查看了一些在线示例或教程,但我有点迷茫。如何使用类并重载 << 运算符,将 type T 的变量复制到缓冲区中??

有什么方向吗?

我的课程概览:

class CBufferedMem
{
public:
    CBufferedMem(unsigned char* buffer, unsigned int size);
    char ReadFromBuffer(void* dst, unsigned char length);
    char writeToBuffer(void src, unsigned char length);
private:
    unsigned char* buffer;
    unsigned short buffSize;
    unsigned char* currentTmpLocation;
    unsigned char* endOfBuffer;
};

【问题讨论】:

  • 你能告诉我们你使用的代码吗?
  • 在我尝试了多种解决方案后,我几乎删除了大部分,可能需要一天时间才能找到
  • Boost iostreams library 的类可以帮助您编写自己的流缓冲。
  • 工作用,嵌入式系统应用,QNX,不使用任何外部库
  • 您的问题并不完全清楚,但是您是否有一个特殊的对象要输出任何类型的对象,或者您是否有一个特殊的类要输出到任何输出流?

标签: c++ inheritance operator-overloading buffer iostream


【解决方案1】:

最简单的解决方案是直接使用特殊的缓冲类并重载所需的输出运算符:

struct buffer_class
{
    // The data needed...
};

inline buffer_class& operator<<(buffer_class& buffer, const std::string& s)
{
    // Code to add the string to the buffer
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const uint8_t ub)
{
    // Code to add the value to the buffer
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const int8_t sb)
{
    // Code to add the value to the buffer
    return buffer;
}

为所需的所有数据添加更多运算符重载。


例如,它可能是这样的:

struct buffer_class
{
    std::vector<int8_t> data;
};

inline buffer_class& operator<<(buffer_class& buffer, const std::string& s)
{
    for (const auto& ch : s)
        buffer.data.push_back(static_cast<unt8_t>(ch));
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const uint8_t ub)
{
    buffer.data.push_back(static_cast<int8_t>(ub));
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const int8_t sb)
{
    buffer.data.push_back(sb);
    return buffer;
}

然后你可以像这样使用它:

buffer_class my_buffer;

buffer << std::string("Hello") << 123:

// The raw data can now be accessed by `my_buffer.data.data()`

【讨论】:

  • @abdul 添加了一些快速示例实现。
  • 我的缓冲区类是一个BYTE指针,有大小,运算符重载有memcpy,还有一个当前缓冲区位置
  • 你能把 my_buffer.data.data() 打印成一个字符串,最后通过 push_back 一个 null 吗?但是我的编译器没有 c++11
【解决方案2】:

您不想从 iostream 继承来执行此操作。

您要做的是编写自己的流缓冲区类,将其数据发送到套接字或消息队列。

周围有各种socket stream 类来演示如何执行此操作。其中许多(大多数?)都相当老了,因为流模型在套接字上并不能很好地工作,但是如果你想尝试它,代码就在那里(包括源代码,所以它展示了如何做同样的事情你自己——这实际上并不难)。

【讨论】:

  • 我喜欢这个,你能重载 > 运算符吗?
  • @abdul:执行此操作时,会将流缓冲区与 iostream 配对,因此 iostream 的现有 &gt;&gt;&lt;&lt; 运算符可与您的缓冲区一起使用。
  • 你是什么意思,通过“将流缓冲区与 iostream 匹配”
  • @abdul 不,因为它存储数据二进制。如果你想将数据作为字符串存储和使用,你不需要特殊的缓冲区类,那么你有std::ostringstream
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2017-05-30
  • 2019-03-31
  • 1970-01-01
  • 2013-02-21
  • 2021-12-22
  • 2018-02-07
相关资源
最近更新 更多