C++ 实现缓冲接收器对象时,如何知道何时';m在要写入的数据末尾?

C++ 实现缓冲接收器对象时,如何知道何时';m在要写入的数据末尾?,c++,boost,file-io,iostream,C++,Boost,File Io,Iostream,我正在模拟一个可以写入数据的接收器类型的设备。这将在写入512字节块的上下文中使用 在接收器内部,字节缓冲到512字节向量;满时,此缓冲区将写入当前选定的512字节块。然后清空缓冲区,可以写入下一个块 因此,我的问题是:如果缓冲区未满,例如,当没有更多传入数据时,如何成功刷新剩余内容?我当然可以实现一个公共刷新功能,但这感觉不是特别优雅。想法: class DataWriter { public: DataWriter(/* ommitted for brevity */) {}

我正在模拟一个可以写入数据的接收器类型的设备。这将在写入512字节块的上下文中使用

在接收器内部,字节缓冲到512字节向量;满时,此缓冲区将写入当前选定的512字节块。然后清空缓冲区,可以写入下一个块

因此,我的问题是:如果缓冲区未满,例如,当没有更多传入数据时,如何成功刷新剩余内容?我当然可以实现一个公共刷新功能,但这感觉不是特别优雅。想法:

class DataWriter
{

public:

    DataWriter(/* ommitted for brevity */) {}

    typedef char                                   char_type;
    typedef boost::iostreams::seekable_device_tag  category;

    std::streamsize write(char_type const * const buf, std::streamsize const n) const
    {
        for(int i = 0; i < n; ++i) {
            bufferByteForWriting(s[i]);
        }
        return n;
    }

    // to flush any remaining data. Doesn't feel 
    // that elegant
    void flush()
    {
        writeBufferedDataToBlock(m_buffer.size());
    }

private:
    void bufferByteForWriting(char const byte) const
    {
        if(m_buffer.size() == 512) {
            writeBufferedDataToBlock(512);
            std::vector<uint8_t>.swap(m_buffer);
        }
    }

    writeBufferedDataToBlock(unsigned long const count) const
    {
        // omitted for brevity
        // this writes data to a specific block
        // and increments to a new 512 byte block
        // that the next 512 byte chunk of data will be written to
    }

    std::vector<uint8_t> m_buffer;
};
类数据编写器
{
公众:
数据编写器(/*为简洁起见指定*/){
typedef char_类型;
typedef boost::iostreams::可查找的\u设备\u标签类别;
std::streamsize write(字符类型常量*常量buf,std::streamsize常量n)常量
{
对于(int i=0;i
刷新DataWriter析构函数中的缓冲区似乎是一个合理的想法。这可以与公共刷新方法结合使用。这就是std::ostream的工作原理。它基本上有相同的问题。谢谢约翰,这听起来是一个很好的解决方案。干杯我不会在析构函数中刷新数据,因为析构函数通常是一个不应该失败的函数,但是刷新数据可能会失败。因此,使用public flush()函数是通常的做法,只要确保flush是在尽可能高的级别上调用的