Opened 11 years ago
Last modified 10 years ago
#6722 new Bugs
Incorrect behaviour of boost::iostreams::filtering_stream with boost::iterator_range
Reported by: | Owned by: | Jonathan Turkanis | |
---|---|---|---|
Milestone: | To Be Determined | Component: | iostreams |
Version: | Boost 1.48.0 | Severity: | Problem |
Keywords: | Cc: | jeffrey.hellrung |
Description
Please consider the following code:
#include <boost/iostreams/filtering_stream.hpp> #include <boost/range/iterator_range.hpp> #include <sstream> template <class Stream> std::string read_to_string(Stream& stream) { std::ostringstream destStream; destStream << stream.rdbuf(); return destStream.str(); } void main() { std::istringstream sourceStream("123"); std::istream_iterator<char> begin(sourceStream); std::istream_iterator<char> end; auto range = boost::make_iterator_range(begin, end); boost::iostreams::filtering_stream<boost::iostreams::input> sourceFilteringStream; sourceFilteringStream.push(range, 1); std::string output = read_to_string(sourceFilteringStream); BOOST_ASSERT("123" == output); }
After each char from "sourceStream" it produces additional garbage char in "output" and triggers the assert (at least in VS10). I've traced it to this code in boost/iostreams/detail/adapter/range_adapter.hpp:
template<> struct range_adapter_impl<std::forward_iterator_tag> { template<typename Iter, typename Ch> static std::streamsize read (Iter& cur, Iter& last, Ch* s,std::streamsize n) { std::streamsize rem = n; // No. of chars remaining. while (cur != last && rem-- > 0) *s++ = *cur++; return n - rem != 0 ? n - rem : -1; } ...
"rem" becomes -1 after the end of the while-loop and the return value after reading 1 char is 2.
Attachments (2)
Change History (4)
by , 10 years ago
Attachment: | range_adapter.hpp.patch added |
---|
comment:1 by , 10 years ago
by , 10 years ago
Attachment: | trunk.libs.iostreams.test.patch added |
---|
comment:2 by , 10 years ago
Cc: | added |
---|
Note:
See TracTickets
for help on using tickets.
Would the attached patch address this issue? I'm not really sure what the read member function should be returning, but I added the code in your description to my local Iostreams unit tests; it fails before applying the patch and succeeds after.