Добрый день!
Работаю с файлами, используя 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;