Connecting Tech Pros Worldwide Help | Site Map

several input-output questions

 
LinkBack Thread Tools Search this Thread
  #1  
Old June 17th, 2007, 01:05 PM
Jess
Guest
 
Posts: n/a
Default several input-output questions

Hello,

When I copy contents from an input string to a vector, I typically use
something like this

vector<stringv;
ifstream in("file");
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));

However, I also tried to define istream_iterator separately. I did

istream_iterator<stringit(in);

this works, but there's no way I can define something equivalent to
istream_iterator<string>() above. I tried

istream_iterator<stringit;

and this failed. What does "istream_iterator<string>()" mean? Does
it define an iterator that's not bound to any istream? If so, why my
code above "istream_iterator<stringit;" doesn't work?

There are some error-detection functions, such as "bad(), "good()",
"fail()". I'm not sure what constitutes "errors". If I read from a
file and hit the end of the file, does it leave the stream in an error
state? If the reading reaches EOF, then do I need to use "clear()" to
reset it? If I use "clear()" to reset a stream (for whatever error
reasons), are the remaining data on the stream lost?

Thanks a lot!
Jess


  #2  
Old June 17th, 2007, 01:25 PM
John Harrison
Guest
 
Posts: n/a
Default Re: several input-output questions

Jess wrote:
Quote:
Hello,
>
When I copy contents from an input string to a vector, I typically use
something like this
>
vector<stringv;
ifstream in("file");
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
>
However, I also tried to define istream_iterator separately. I did
>
istream_iterator<stringit(in);
>
this works, but there's no way I can define something equivalent to
istream_iterator<string>() above. I tried
>
istream_iterator<stringit;
>
and this failed.
It should work (apart from the fact that you seem to have used the
variable name 'it' twice). What error did you get?

What does "istream_iterator<string>()" mean? Does
Quote:
it define an iterator that's not bound to any istream? If so, why my
code above "istream_iterator<stringit;" doesn't work?
>
There are some error-detection functions, such as "bad(), "good()",
"fail()". I'm not sure what constitutes "errors". If I read from a
file and hit the end of the file, does it leave the stream in an error
state?
Yes

If the reading reaches EOF, then do I need to use "clear()" to
Quote:
reset it?
Yes, but be careful here, reaching the end of file is not the same as
trying to read past the end of file. Only the latter is an error.

If I use "clear()" to reset a stream (for whatever error
Quote:
reasons), are the remaining data on the stream lost?
No
Quote:
>
Thanks a lot!
Jess
>
  #3  
Old June 17th, 2007, 01:45 PM
Jess
Guest
 
Posts: n/a
Default Re: several input-output questions

On Jun 17, 11:16 pm, John Harrison <john_androni...@hotmail.com>
wrote:
Quote:
Jess wrote:
Quote:
Hello,
>
Quote:
When I copy contents from an input string to a vector, I typically use
something like this
>
Quote:
vector<stringv;
ifstream in("file");
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
>
Quote:
However, I also tried to define istream_iterator separately. I did
>
Quote:
istream_iterator<stringit(in);
>
Quote:
this works, but there's no way I can define something equivalent to
istream_iterator<string>() above. I tried
>
Quote:
istream_iterator<stringit;
>
Quote:
and this failed.
>
It should work (apart from the fact that you seem to have used the
variable name 'it' twice). What error did you get?
Thanks, I tried it again, and this error disappears. :) By the way,
it seems both "istream_iterator it();" and "istream_iterator it;"
work, is there any difference?
Jess

  #4  
Old June 17th, 2007, 01:45 PM
Robert Bauck Hamar
Guest
 
Posts: n/a
Default Re: several input-output questions

Jess wrote:
Quote:
On Jun 17, 11:16 pm, John Harrison <john_androni...@hotmail.com>
wrote:
Quote:
>Jess wrote:
Quote:
Hello,
>>
Quote:
When I copy contents from an input string to a vector, I typically use
something like this
>>
Quote:
vector<stringv;
ifstream in("file");
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
>>
Quote:
However, I also tried to define istream_iterator separately. I did
>>
Quote:
istream_iterator<stringit(in);
>>
Quote:
this works, but there's no way I can define something equivalent to
istream_iterator<string>() above. I tried
>>
Quote:
istream_iterator<stringit;
>>
Quote:
and this failed.
>>
>It should work (apart from the fact that you seem to have used the
>variable name 'it' twice). What error did you get?
>
Thanks, I tried it again, and this error disappears. :) By the way,
it seems both "istream_iterator it();" and "istream_iterator it;"
work, is there any difference?
istream_iterator it();

declares it as a function returning an istream_iterator, whereas

istream_iterator it;

defines it as an istream_iterator object and calls its default constructor.

--
rbh
  #5  
Old June 17th, 2007, 01:55 PM
John Harrison
Guest
 
Posts: n/a
Default Re: several input-output questions

Jess wrote:
Quote:
On Jun 17, 11:16 pm, John Harrison <john_androni...@hotmail.com>
wrote:
Quote:
>Jess wrote:
Quote:
>>Hello,
>>When I copy contents from an input string to a vector, I typically use
>>something like this
>>vector<stringv;
>>ifstream in("file");
>>copy(istream_iterator<string(in), istream_iterator<string>(),
>>back_inserter(v));
>>However, I also tried to define istream_iterator separately. I did
>>istream_iterator<stringit(in);
>>this works, but there's no way I can define something equivalent to
>>istream_iterator<string>() above. I tried
>>istream_iterator<stringit;
>>and this failed.
>It should work (apart from the fact that you seem to have used the
>variable name 'it' twice). What error did you get?
>
Thanks, I tried it again, and this error disappears. :) By the way,
it seems both "istream_iterator it();" and "istream_iterator it;"
work, is there any difference?
Jess
>
Well this time I will say that it should NOT work. This

istream_iterator<stringit;

declares a variable called 'it' of type istream_iterator<string>, no
problem. But this

istream_iterator<stringit();

declares a FUNCTION called 'it' which takes zero arguments and returns a
istream_iterator<string>. This is a common newbie mistake, by adding the
brackets you've written a function prototype.

I guess this was the source of your original confusion.

john
  #6  
Old June 17th, 2007, 01:55 PM
Jess
Guest
 
Posts: n/a
Default Re: several input-output questions

I see my problems now, thanks!

On the other hand, in program

copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));

Does it convert "in" to an istream_iterator<string>? If so, what is
"istream_iterator<string>()"? Neither of them looks like a function
call or constructing an istream_iterator<stringobject...

Jess

  #7  
Old June 17th, 2007, 02:05 PM
Obnoxious User
Guest
 
Posts: n/a
Default Re: several input-output questions

On Sun, 17 Jun 2007 06:52:21 -0700, Jess wrote:
Quote:
I see my problems now, thanks!
>
On the other hand, in program
>
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
>
Does it convert "in" to an istream_iterator<string>? If so, what is
"istream_iterator<string>()"? Neither of them looks like a function
call or constructing an istream_iterator<stringobject...
>
Jess
'istream_iterator<string>(in)' creates a temporary object based on 'in'
'istream_iterator<string>()' creates a temporary object representing the
end iterator.
'back_inserter(v)' creates a temporary object

Consider:

class T {};

T t = T();

--
Obnoxious User
  #8  
Old June 17th, 2007, 02:35 PM
Jess
Guest
 
Posts: n/a
Default Re: several input-output questions

On Jun 17, 11:44 pm, Obnoxious User <O...@127.0.0.1wrote:
Quote:
On Sun, 17 Jun 2007 06:52:21 -0700, Jess wrote:
Quote:
I see my problems now, thanks!
>
Quote:
On the other hand, in program
>
Quote:
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
>
Quote:
Does it convert "in" to an istream_iterator<string>? If so, what is
"istream_iterator<string>()"? Neither of them looks like a function
call or constructing an istream_iterator<stringobject...
>
Quote:
Jess
>
'istream_iterator<string>(in)' creates a temporary object based on 'in'
'istream_iterator<string>()' creates a temporary object representing the
end iterator.
'back_inserter(v)' creates a temporary object
Consider:
>
class T {};
>
T t = T();
I'm sometimes confused by the object creation syntax. To create an
object t of type T, I think I can use the following statements.

T t; //default constructor
T t(arg); //constructor with argument arg
T t = T(); //call default constructor for T()? then call copy
constructor to create t using the temporary object created from T()
T t = T(arg); //does the right hand side call the constructor with
argument arg, then call the copy constructor to get t?
T t = existing_t_object;
T* tp = new T; //call default constructor
T* tp = new T(arg); //constructor with argument arg

Are they correct? Have I missed something?

Thanks,
Jess

  #9  
Old June 17th, 2007, 07:55 PM
James Kanze
Guest
 
Posts: n/a
Default Re: several input-output questions

On Jun 17, 3:52 pm, Jess <w...@hotmail.comwrote:
Quote:
I see my problems now, thanks!
Quote:
On the other hand, in program
Quote:
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
Quote:
Does it convert "in" to an istream_iterator<string>? If so, what is
"istream_iterator<string>()"? Neither of them looks like a function
call or constructing an istream_iterator<stringobject...
According to the standard, they are both function style casts.
The first converting in into an istream_iterator<string>, and
the second converting nothing into an istream_iterator<string>.
In practice, most people view them as explicit creation of a
temporary, the first initialized with "in", and the second
initialized using the default constructor. (Converting nothing
into something doesn't sound much like a cast in most people's
mind, regardless of what the standard calls it.)

--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

  #10  
Old June 17th, 2007, 07:55 PM
James Kanze
Guest
 
Posts: n/a
Default Re: several input-output questions

On Jun 17, 4:25 pm, Jess <w...@hotmail.comwrote:
Quote:
On Jun 17, 11:44 pm, Obnoxious User <O...@127.0.0.1wrote:
Quote:
On Sun, 17 Jun 2007 06:52:21 -0700, Jess wrote:
Quote:
I see my problems now, thanks!
Quote:
Quote:
Quote:
On the other hand, in program
Quote:
Quote:
Quote:
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
Quote:
Quote:
Quote:
Does it convert "in" to an istream_iterator<string>? If so, what is
"istream_iterator<string>()"? Neither of them looks like a function
call or constructing an istream_iterator<stringobject...
Quote:
Quote:
'istream_iterator<string>(in)' creates a temporary object based on 'in'
'istream_iterator<string>()' creates a temporary object representing the
end iterator.
'back_inserter(v)' creates a temporary object
Consider:
Quote:
Quote:
class T {};
Quote:
Quote:
T t = T();
Quote:
I'm sometimes confused by the object creation syntax. To create an
object t of type T, I think I can use the following statements.
Quote:
T t; //default constructor
T t(arg); //constructor with argument arg
T t = T(); //call default constructor for T()? then call copy
constructor to create t using the temporary object created from T()
T t = T(arg); //does the right hand side call the constructor with
argument arg, then call the copy constructor to get t?
T t = existing_t_object;
T* tp = new T; //call default constructor
T* tp = new T(arg); //constructor with argument arg
Quote:
Are they correct? Have I missed something?
They're all correct for creating named objects. There are,
however, two types unnamed objects: those created using operator
new (dynamically allocated objects), and temporary objects. A
temporary object is the result of an expression: in the case of
an object of class type, a function call or a "cast". Thus, for
example: "static_cast< T >( arg )" behaves exactly like "T
t(arg)", except that the resulting object is unnamed. Of
course, there are two other ways of writing
"static_cast<T>(arg)": "(T)arg" and "T(arg)". In the latter
case, the standard also allows 0 or more than one argument; it
still calls it a cast, even if it doesn't seem very logical.

--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

  #11  
Old June 18th, 2007, 10:05 AM
Jess
Guest
 
Posts: n/a
Default Re: several input-output questions

On Jun 18, 5:51 am, James Kanze <james.ka...@gmail.comwrote:
Quote:
On Jun 17, 4:25 pm, Jess <w...@hotmail.comwrote:
>
>
>
Quote:
On Jun 17, 11:44 pm, Obnoxious User <O...@127.0.0.1wrote:
Quote:
On Sun, 17 Jun 2007 06:52:21 -0700, Jess wrote:
I see my problems now, thanks!
On the other hand, in program
copy(istream_iterator<string(in), istream_iterator<string>(),
back_inserter(v));
Does it convert "in" to an istream_iterator<string>? If so, what is
"istream_iterator<string>()"? Neither of them looks like a function
call or constructing an istream_iterator<stringobject...
'istream_iterator<string>(in)' creates a temporary object based on 'in'
'istream_iterator<string>()' creates a temporary object representing the
end iterator.
'back_inserter(v)' creates a temporary object
Consider:
class T {};
T t = T();
I'm sometimes confused by the object creation syntax. To create an
object t of type T, I think I can use the following statements.
T t; //default constructor
T t(arg); //constructor with argument arg
T t = T(); //call default constructor for T()? then call copy
constructor to create t using the temporary object created from T()
T t = T(arg); //does the right hand side call the constructor with
argument arg, then call the copy constructor to get t?
T t = existing_t_object;
T* tp = new T; //call default constructor
T* tp = new T(arg); //constructor with argument arg
Are they correct? Have I missed something?
>
They're all correct for creating named objects. There are,
however, two types unnamed objects: those created using operator
new (dynamically allocated objects), and temporary objects. A
temporary object is the result of an expression: in the case of
an object of class type, a function call or a "cast". Thus, for
example: "static_cast< T >( arg )" behaves exactly like "T
t(arg)", except that the resulting object is unnamed. Of
course, there are two other ways of writing
"static_cast<T>(arg)": "(T)arg" and "T(arg)". In the latter
case, the standard also allows 0 or more than one argument; it
still calls it a cast, even if it doesn't seem very logical.
>
--
James Kanze (Gabi Software) email: james.ka...@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
I see now, thanks a lot!
Jess

 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,840 network members.