Как определить размер файла, использую iostream
От: silart  
Дата: 06.07.11 03:15
Оценка:
Добрый день!

Работаю с файлами, используя boost::filesystem. Файловые потоки определены так:

typedef boost::filesystem::basic_ofstream<ml::byte_t> bofstream;
typedef boost::filesystem::basic_ifstream<ml::byte_t> bifstream;

где ml::byte_t объявлен следующим образом:

typedef boost::uint8_t byte_t;


Для unit-тестов я использую вместо буфера пишущего/читающего в/из файл свой буфер, который пишет/читает в/из std::vector<ml::byte_t>.
Подменяю файловый буфер своим я так:


typedef std::basic_ios<ml::byte_t, std::char_traits<ml::byte_t> > bios;
...
bifstream m_fileStream;
...
    bios& ios = m_fileStream;
    ios.rdbuf(&buffer);


После этого выполняю следующий код для определения количества символов, которые остались в потоке:

    bifstream::pos_type cur = 
        m_fileStream.tellg();

    m_fileStream.seekg(0, ios::end);

    bifstream::pos_type end = m_fileStream.tellg();

    m_fileStream.seekg(cur);

    int size = end - cur;


И size получается нулевым, хотя в потоковый буфер я загрузил нужные данные и заголовок уже был прочитан из потока. В буфере должны быть еще данные.
Может это быть связано с тем, что потоковый буфер реализован некорректно? Привожу код потокового буфера:

template<typename T>
class basic_memstreambuf : public std::basic_streambuf<T, std::char_traits<T> >
{
public:
    typedef typename std::basic_streambuf<T, typename std::char_traits<T> > base_t;
    typedef typename base_t::char_type char_type;
    typedef typename base_t::traits_type traits_type;
    typedef typename base_t::traits_type::int_type int_type;

private:
    std::vector<char_type> m_buffer;

public:
    basic_memstreambuf() : m_buffer(256)
    {
        setp(&m_buffer[0], &m_buffer[0] + m_buffer.size());
    }

    basic_memstreambuf(const std::vector<char_type>& buffer) : m_buffer(buffer)
    {
        // Буфер заполнен полностью
        setp(&m_buffer[0] + m_buffer.size(), 
             &m_buffer[0] + m_buffer.size(), 
             &m_buffer[0] + m_buffer.size());

        setg(&m_buffer[0], &m_buffer[0], &m_buffer[0] + m_buffer.size());
    }

public:
    char_type const* begin() const { return pbase(); }
    char_type const* end() const { return pptr(); }

private:
    int_type overflow(int_type c)
    {
        if (!traits_type::eq_int_type(c, traits_type::eof()))
        {
            m_buffer.push_back(traits_type::to_char_type(c));
            size_t const next_pos(m_buffer.size());
            m_buffer.resize(m_buffer.capacity());

            setp(&m_buffer[0], 
                &m_buffer[0] + next_pos, 
                &m_buffer[0] + m_buffer.size());
        }

        return !traits_type::eof();
    }
};

typedef basic_memstreambuf<ml::byte_t> memstreambuf;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.