Help with reading formatted input from an istream

T

Ttodir

Consider the following program:

#include <iostream>
#include <iterator>
#include <string>
#include <set>
#include <algorithm>

using namespace std;

typedef string T; // to simplify, always consider T as string

template<typename input_iterator>
void do_something(const input_iterator& first, const input_iterator&
last) {
const ostream_iterator<T> os(cout, "\n");
const set<T> words(first, last);
copy(words.begin(), words.end(), os);
}

int main(int argc, char** argv) {
const istream_iterator<T> is(cin), eof;
do_something(is, eof);
return 0;
}

The program extracts all the words from an istream (cin) and does
something with them. Each word is seperated by a white space by
default. The logic behind the formatted extraction is inside the
istream_iterator.

What I need to do now is to pass to do_something() two iterators so
that the extracted words will be separated by a punctuation character
instead of a white space (white spaces will be considered as "normal"
characters). How would you do that in a "clean C++ way" (that is, with
the minimum effort)?
 
I

Ian Collins

Consider the following program:

#include<iostream>
#include<iterator>
#include<string>
#include<set>
#include<algorithm>

using namespace std;

typedef string T; // to simplify, always consider T as string

template<typename input_iterator>
void do_something(const input_iterator& first, const input_iterator&
last) {
const ostream_iterator<T> os(cout, "\n");
const set<T> words(first, last);
copy(words.begin(), words.end(), os);
}

int main(int argc, char** argv) {
const istream_iterator<T> is(cin), eof;
do_something(is, eof);
return 0;
}

The program extracts all the words from an istream (cin) and does
something with them. Each word is seperated by a white space by
default. The logic behind the formatted extraction is inside the
istream_iterator.

What I need to do now is to pass to do_something() two iterators so
that the extracted words will be separated by a punctuation character
instead of a white space (white spaces will be considered as "normal"
characters). How would you do that in a "clean C++ way" (that is, with
the minimum effort)?

Derive your own input iterator class from std::input_iterator.
 
T

Ttodir

The "clean C++ way" would be to imbue your own ctype facet which lets
you classify what exactly is white space.

/Leigh

thank you Leigh. That's really the thing to do.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top