Boost logo

Boost Users :

Subject: Re: [Boost-users] [iostreams] why doesn't file_sink flush?
From: Andy Schweitzer (a.schweitzer.grps_at_[hidden])
Date: 2009-05-05 22:49:50

eg wrote:
> Andy Schweitzer wrote:
>> eg wrote:
>>> Andrew Schweitzer wrote:
>> Thanks, I've read that, but it doesn't directly answer my questions.
>> In particular, a) fstream flush seems to work fine, so I'm curious why
>> file_sink doesn't call it and b) given that you can't flush a
>> file_sink what is the appropriate implementation - it seems like there
>> would be one that is relatively straight-forward.
> Good questions.
> I dont know why file_sink or file_descriptor_sink are not currently
> implemented with the flushable_tag.
> It looks like it would be very straightforward to add.
> My usage of iostreams has always involved the gzip filters, which are
> not flushable either, so I haven't run into this and don't have a
> solution... other than adding flush support to file_sink.
> Is there more to it than adding the flushable_tag, and adding a flush
> function to basic_file_sink and basic_file<Ch>, the latter simply
> calling pimpl->file_.flush() ?

That's a good idea. I don't know, I don't know the library well enough.
That seemed like more code... but maybe a better idea. I tried this,
wrapping fstream. Not sure if there's a reason not to do this:

class flushable_file_sink
        flushable_file_sink(const std::string& path,
                BOOST_IOS::openmode mode = BOOST_IOS::out)
                           :m_fs(path.c_str(), mode), m_strName(path), m_mode(mode)

        flushable_file_sink(const flushable_file_sink& rOther)
                m_strName = rOther.m_strName;
                m_mode = rOther.m_mode;
      , m_mode);

        struct category
         : output_seekable,
        { };

     typedef char char_type;

        std::streamsize write(const char* buf, std::streamsize n)
                m_fs.write(buf, n);
                return n;

        bool flush()
                return true;

     void close()
                m_bOpen = m_fs.is_open();

     void close(std::ios_base::openmode mode)

     std::streamsize read(char_type* s, std::streamsize n)
      , n);
                return n;

     std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
                          BOOST_IOS::openmode which =
                              BOOST_IOS::in | BOOST_IOS::out )
                m_fs.seekp(off, way);
                m_fs.seekg(off, way);
                return off;

        mutable fstream m_fs;
        string m_strName;
        BOOST_IOS::openmode m_mode;
        bool m_bOpen;

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at