代码之家  ›  专栏  ›  技术社区  ›  Trevor Robinson

是否可以使用文件描述符创建双搜索Boost Iostream?

  •  1
  • Trevor Robinson  · 技术社区  · 16 年前

    我正在尝试使用std::iostream接口更新一个随机访问二进制文件,该接口通过seekg/seekp管理单独的get/put位置。使用stringstream一切正常,但是当我使用Boost.Iostream(特别是Boost::iostreams:)创建基于文件描述符的流时: stream <boost::iostreams:: file_descriptor >),get/put位置不再独立。

    我收集了关于 Modes 我要找的是“双搜索”流。文档显示Mode是的模板参数 流动 ,“主要用于内部使用”,但这似乎(不再?)是正确的。取而代之的是,直接从设备获取模式(也称为类别?):

    template< typename Device,
              typename Tr = ...,
              typename Alloc = ...>
    struct stream : detail::stream_base<Device, Tr, Alloc> {
    public:
        typedef typename char_type_of<Device>::type  char_type;
        struct category 
            : mode_of<Device>::type,
              closable_tag,
              detail::stream_traits<Device, Tr>::stream_tag
            { };
    

    第二个问题:seekg/seekp的独立性是否有任何一般保证?我从网络搜索中发现,stringstream似乎是独立的,但fstream可能不是。但是,我找不到任何权威。

    1 回复  |  直到 16 年前
        1
  •  1
  •   hkaiser    16 年前

    如果你构造了一个双向搜索 boost::iostreams::device 它将支持两个单独的get/put位置,可以在 iostreams::seek 功能。

    大致上,这看起来像:

    struct binary_seekable_device 
     : boost::iostreams::device<boost::iostreams::bidirectional_seekable>
    {
        explicit binary_seekable_device(int fd)
          : fd(fd), pos_read(0), pos_write(0) {}
    
        std::streamsize read(char *s, std::streamsize n);
        std::streamsize write(char const *s, std::streamsize n);
        std::streampos seek(boost::iostreams::stream_offset off,
            std::ios::seekdir way, std::ios::openmode which);
    
        int fd; 
        std::size_t pos_read;
        std::size_t pos_write;
    };
    

    您需要通过填写三个函数(read、write、seek)来实现流逻辑,有关详细信息,请参阅示例和文档。重要的一点是参数 std::ios::openmode which 告诉你哪些位置(读、写或两者)需要更新。

    现在,在实例化boost::iostreams::stream时使用此设备:

    int fd = open(...);
    boost::iostream::stream<binary_seekable_device> s(fd);
    

    其中s是您的流实例,您可以使用它来执行所需的文件操作。