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