Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Adding a istream_iterator ctor with a delimiter.

147 views
Skip to first unread message

Ed Smith-Rowland

unread,
Dec 11, 2009, 1:47:07 PM12/11/09
to
Greetings,

I was writing a little program to parse a tab delimited file.
Each line has several strings (which can contain spaces) and numbers.

The spaces in the strings spoil usage of istream_iterator in this
problem. This is obviously surmountable but the more I think about it
the more surprising this is.

It looks to me like there is an old oversight in istream_iterator.
It
would be nice to be able to add a delim string ctor:

istream_iterator (istream_type & __in, char_type * __delim);

That way, ostream_iterator(ostream_type & __out, char_type * __delim)
and the above would do the opposite things and be a useful, intuitive
pair of utilities.

Is there any reason this was not done? Could it be added as a DR?

Ed

--
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std...@netlab.cs.rpi.edu]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]

hak...@gmail.com

unread,
Dec 12, 2009, 9:22:32 PM12/12/09
to
On Dec 11, 1:47 pm, Ed Smith-Rowland <3dw...@verizon.net> wrote:

> istream_iterator (istream_type & __in, char_type * __delim);

I think the istream_iterator was not designed for what you wish it
was. As a simple iterator for the istream, it does a great job. I
think a better proposal would be for a new iterator.

> That way, ostream_iterator(ostream_type & __out, char_type * __delim)
> and the above would do the opposite things and be a useful, intuitive
> pair of utilities.

The ostream_iterator already has a constructor accepting an
ostream_type& and char_type*. Thus, this could not be added.

The reason I'm responding (since I think all I've said thus far will
be said again more than once) is to recommend making a
delimited_iterator wrapper, or something like that. For example:

std::copy( delimited_iterator( std::istream_iterator(cin), ' ' ),
delimited_iterator<std::istream_iterator,char>(), cin );
or
std::copy( delimited_iterator( std::istream_iterator(cin), ' ' ),
delimited_iterator( std::istream_iterator(), '' ), cin );

This would actually require that delimited_iterator be a function that
returns an iterator (like DelimitedIterator). Otherwise, each call
above would have to explicitly use <>'s to show the types.

It's midnight and I don't feel like testing the idea out at the
moment, but I at least wanted to share it. Perhaps tomorrow, I will
give it a shot.

Also: This is one problem that the concept of ranges fixes. I don't
much like ranges and they aren't in the standard (yet?), but you might
look into it.

Ed Smith-Rowland

unread,
Dec 14, 2009, 12:41:03 PM12/14/09
to
On Dec 11, 1:47 pm, Ed Smith-Rowland <3dw...@verizon.net> wrote:
> Greetings,
>
> I was writing a little program to parse a tab delimited file.
> Each line has several strings (which can contain spaces) and numbers.
>
> The spaces in the strings spoil usage of istream_iterator in this
> problem. This is obviously surmountable but the more I think about it
> the more surprising this is.
>
> It looks to me like there is an old oversight in istream_iterator.
> It
> would be nice to be able to add a delim string ctor:
>
> istream_iterator (istream_type & __in, char_type * __delim);
>
> That way, ostream_iterator(ostream_type & __out, char_type * __delim)
> and the above would do the opposite things and be a useful, intuitive
> pair of utilities.
>
> Is there any reason this was not done? Could it be added as a DR?
>
> Ed
>
> --
> [ comp.std.c++ is moderated. To submit articles, try just posting with ]
> [ your news-reader. If that fails, use mailto:std-...@netlab.cs.rpi.edu]

> [ --- Please see the FAQ before posting. --- ]
> [ FAQ:http://www.comeaucomputing.com/csc/faq.html ]

On third thought, this makes no sense.

There's really no generic, sane way to have an istream_iterator that
doesn't let the extraction operator for the type have a go at the
stream. It isn't like a normal person would want to use the number 0
to split integers.

If I really wanted to extract wulti-word phrases out of a delimited
file (which is the only thing I was concerned about - the numbers work
fine of course) a better way might be to have a little phrase class
with an extraction operator that stops on tabs (or any user specified
separator).

Scott Meyers

unread,
Dec 19, 2009, 1:55:08 AM12/19/09
to
Ed Smith-Rowland wrote:
> If I really wanted to extract wulti-word phrases out of a delimited
> file (which is the only thing I was concerned about - the numbers work
> fine of course) a better way might be to have a little phrase class
> with an extraction operator that stops on tabs (or any user specified
> separator).

Why not just use a std::regex_iterator (or std::tr1::regex_iterator)?

Scott

0 new messages