By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,733 Members | 940 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,733 IT Pros & Developers. It's quick & easy.

Problem | Istream_iterator in std::copy

P: n/a
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::stringvecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrR ead),
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<intvi;//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

Oct 19 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Pradeep wrote:
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::stringvecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrR ead),
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::stringvecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrR ead),
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.
Oct 19 '06 #2

P: n/a

Pradeep wrote:
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::stringvecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrR ead),
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<intvi;//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

Oct 19 '06 #3

P: n/a
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
Piyush wrote:
Pradeep wrote:
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::stringvecStr;
std::ifstream fstrRead("Test.txt");
if(!fstrRead)
{
std::cerr<<"Cannot Read the file"<<std::endl;
exit(-1);
}

std::copy(std::istream_iterator<std::string>(fstrR ead),
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<intvi;//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
Oct 19 '06 #4

P: n/a
Pradeep <pr***********@gmail.comwrote:
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....ca1ef940f093d/

(look at post 6 by Jerry Coffin).

--
Marcus Kwok
Replace 'invalid' with 'net' to reply
Oct 19 '06 #5

P: n/a
Sumit Rajan wrote:
>
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>?
Oct 19 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.