Problem | Istream_iterator in std::copy

Discussion in 'C++' started by Pradeep, Oct 19, 2006.

  1. Pradeep

    Pradeep Guest

    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
     
    Pradeep, Oct 19, 2006
    #1
    1. Advertising

  2. Pradeep

    Sumit Rajan Guest

    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::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.
     
    Sumit Rajan, Oct 19, 2006
    #2
    1. Advertising

  3. Pradeep

    Piyush Guest

    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::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
     
    Piyush, Oct 19, 2006
    #3
  4. Pradeep

    Pradeep Guest

    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::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
     
    Pradeep, Oct 19, 2006
    #4
  5. Pradeep

    Marcus Kwok Guest

    Pradeep <> wrote:
    > 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).

    --
    Marcus Kwok
    Replace 'invalid' with 'net' to reply
     
    Marcus Kwok, Oct 19, 2006
    #5
  6. 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>?
     
    =?ISO-8859-1?Q?Jens_M=FCller?=, Oct 19, 2006
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Marcus Kwok
    Replies:
    2
    Views:
    888
    Marcus Kwok
    Dec 2, 2005
  2. George
    Replies:
    6
    Views:
    790
    George
    Dec 19, 2005
  3. dragoncoder

    Problem with std::istream_iterator

    dragoncoder, Sep 18, 2006, in forum: C++
    Replies:
    8
    Views:
    514
    Jerry Coffin
    Sep 18, 2006
  4. eric
    Replies:
    3
    Views:
    985
    mrbrklyn
    Jun 24, 2011
  5. Replies:
    8
    Views:
    487
    James Kanze
    Sep 19, 2011
Loading...

Share This Page