C++ streams confusion: istreambuf_iterator vs istream_iterator?

c++, istream, streambuf

Solution

IOstreams use streambufs to as their source / target of input / output. Effectively, the streambuf-family does all the work regarding IO and the IOstream-family is only used for formatting and to-string / from-string transformation.

Now, `istream_iterator` takes a template argument that says what the unformatted string-sequence from the streambuf should be formatted as, like `istream_iterator<int>` will interpret (whitespace-delimited) all incoming text as `int`s.

On the other hand, `istreambuf_iterator` only cares about the raw characters and iterates directly over the associated streambuf of the `istream` that it gets passed.

Generally, if you're only interested in the raw characters, use an `istreambuf_iterator`. If you're interested in the formatted input, use an `istream_iterator`.

All of what I said also applies to `ostream_iterator` and `ostreambuf_iterator`.

Problem

What is the difference between `istreambuf_iterator` and `istream_iterator`? And in general what is the difference between streams and streambufs? I really can't find any clear explanation for this so decided to ask here.

Original source

Related problems