【问题标题】:Recommendations for a C++ polymorphic, seekable, binary I/O interface对 C++ 多态、可搜索、二进制 I/O 接口的建议
【发布时间】:2010-06-15 20:55:43
【问题描述】:

我一直在使用 std::istreamostream 作为 C++ 中随机访问二进制 I/O 的多态接口,但它在许多方面似乎都不是最理想的:

  • 由于 streampos/streamoff 限制,64 位查找是不可移植的且容易出错;目前使用boost/iostreams/positioning.hpp作为解决方法,但需要警惕
  • 缺少诸如截断或扩展文件之类的操作(ala POSIX ftruncate
  • 具体实现之间的不一致;例如stringstream 有独立的 get/put 位置,而 filestream 没有
  • 平台实现之间的不一致;例如寻求通过文件结尾的行为或在错误时使用failbit/badbit
  • 不需要stream 的所有格式化工具,甚至可能不需要streambuf 的缓冲
  • streambuf 错误报告(即异常与返回错误指示符)在实践中应该是 implementation-dependent

我喜欢Boost.Iostreams Device concept 提供的简化接口,但它是作为函数模板而不是多态类提供的。 (有一个device class,但它不是多态的,只是提供的设备实现不一定使用的实现助手类。)我主要使用大型磁盘文件,但我真的想要多态,所以我可以轻松替换替代实现(例如,使用stringstream 而不是fstream 进行单元测试)没有深度模板实例化的所有复杂性和编译时耦合。

有没有人对此有任何标准方法的建议?这似乎是一种常见的情况,所以我不想不必要地发明自己的接口。例如,java.nio.FileChannel 之类的东西似乎很理想。

到目前为止,我最好的解决方案是在 Boost.Iostreams 设备上放置一个薄的多态层。例如:

class my_istream
{
public:
    virtual std::streampos seek(stream_offset off, std::ios_base::seekdir way) = 0;
    virtual std::streamsize read(char* s, std::streamsize n) = 0;
    virtual void close() = 0;
};

template <class T>
class boost_istream : public my_istream
{
public:
    boost_istream(const T& device) : m_device(device)
    {
    }

    virtual std::streampos seek(stream_offset off, std::ios_base::seekdir way)
    {
        return boost::iostreams::seek(m_device, off, way);
    }

    virtual std::streamsize read(char* s, std::streamsize n)
    {
        return boost::iostreams::read(m_device, s, n);
    }

    virtual void close()
    {
        boost::iostreams::close(m_device);
    }

private:
    T m_device;
};

【问题讨论】:

    标签: c++ file-io polymorphism iostream boost-iostreams


    【解决方案1】:

    你看过 Qt 的 QIODevice 类和子类了吗?我不太确定它是否符合您的需求,但也许值得一试:QIODevice

    【讨论】:

    • 感谢您的指点,我忘记了 Qt。我不想依赖它,但它确实提供了一些视角。
    【解决方案2】:

    我最终使用了一组类似于我在问题中概述的抽象接口。似乎没有任何轻量级的多态标准...

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 2011-05-09
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      相关资源
      最近更新 更多