Problem | Istream_iterator in std::copy

P

Pradeep

Hi All,

I am facing some problem using istream_iterator for reading the
contents of a file and copying it in a vector of strings.However the
same thing works for a vector of integers.

The code that doesn't work is

std::vector<std::string> vecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrRead),
std::istream_iterator<std::string> (),
std::back_inserter(vecStr));


The problem is in std::istream_iterator<std::string> (). The
constructor calls the method
void _Getval()
{ // get a _Ty value if possible
if (_Myistr != 0 && !(*_Myistr >> _Myval))
_Myistr = 0;
}

where it fails in conversion.
The compiler error is c:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\iterator(213): error C2679: binary '>>' : no operator
found which takes a right-hand operand of type 'std::string' (or there
is no acceptable conversion)


However this works fine if it is an vector of integers.

vector<int> vi;//vector to be filled
ifstream vi_dump("vi.txt"); //open for read
if (!vi_dump)
{
cerr<<"couldn't open file";
exit(1);
}
copy(istream_iterator<int> (vi_dump),
istream_iterator<int> (),
back_inserter(vi));

I would like to know the reason for this and how it can be solved?

Thanks in Advance,
Pradeep
 
S

Sumit Rajan

Pradeep said:
Hi All,

I am facing some problem using istream_iterator for reading the
contents of a file and copying it in a vector of strings.However the
same thing works for a vector of integers.

The code that doesn't work is

std::vector<std::string> vecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrRead),
std::istream_iterator<std::string> (),
std::back_inserter(vecStr));


Well you'll need to post the actual program(a minimal version that
demonstrates your problem). Please see:
http://www.parashift.com/c++-faq-lite/how-to-post.html


Try compiling:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>


int main()
{
std::vector<std::string> vecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrRead),
std::istream_iterator<std::string> (),
std::back_inserter(vecStr));
}


It compiles for me on both VC++ and Comeau. I suspect that it a case of
your missing out on an #include.

Regards,
Sumit.
 
P

Piyush

Pradeep said:
Hi All,

I am facing some problem using istream_iterator for reading the
contents of a file and copying it in a vector of strings.However the
same thing works for a vector of integers.

The code that doesn't work is

std::vector<std::string> vecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrRead),
std::istream_iterator<std::string> (),
std::back_inserter(vecStr));


The problem is in std::istream_iterator<std::string> (). The
constructor calls the method
void _Getval()
{ // get a _Ty value if possible
if (_Myistr != 0 && !(*_Myistr >> _Myval))
_Myistr = 0;
}

where it fails in conversion.
The compiler error is c:\Program Files\Microsoft Visual Studio .NET
2003\Vc7\include\iterator(213): error C2679: binary '>>' : no operator
found which takes a right-hand operand of type 'std::string' (or there
is no acceptable conversion)


However this works fine if it is an vector of integers.

vector<int> vi;//vector to be filled
ifstream vi_dump("vi.txt"); //open for read
if (!vi_dump)
{
cerr<<"couldn't open file";
exit(1);
}
copy(istream_iterator<int> (vi_dump),
istream_iterator<int> (),
back_inserter(vi));

I would like to know the reason for this and how it can be solved?

Thanks in Advance,
Pradeep

Hey,
The problem with your code is that the string class has a friend
function which handles reading and writing it from a stream.(the >> and
<< operators). Now since this function is declared in the string header
once you include this header the code compiles.
Regards,
Piyush
 
P

Pradeep

Thanks guys. It was a silly mistake.

However the problem with this is that this gives a vector of all words
but I want a vector of lines.

e.g. line 1 "I have a problem"
line 2 "got it"

Now this gives me a vector of strings with size 6 and all the words.
However I want a vector with size 2 and each line in one string.

Any idea around that.

Thanks
Pradeep
 
M

Marcus Kwok

Pradeep said:
Thanks guys. It was a silly mistake.

However the problem with this is that this gives a vector of all words
but I want a vector of lines.

e.g. line 1 "I have a problem"
line 2 "got it"

Now this gives me a vector of strings with size 6 and all the words.
However I want a vector with size 2 and each line in one string.

Any idea around that.

Hi Pradeep,
First, in this newsgroup it is common etiquette not to top-post. Your
responses belong either below, or interspersed with, *properly trimmed*
quotes.

To address your question, please see this thread:

http://groups.google.com/group/comp.lang.c++/browse_frm/thread/845ca1ef940f093d/

(look at post 6 by Jerry Coffin).
 
?

=?ISO-8859-1?Q?Jens_M=FCller?=

Sumit said:
Try compiling:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
std::cerr<<"Cannot Read the file"<<std::endl;

Isn't std::endl necessarily defined only in <ostream>?
 

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,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top