7

Hi I need to read a file that looks like this...

1|Toy Story (1995)|Animation|Children's|Comedy
2|Jumanji (1995)|Adventure|Children's|Fantasy
3|Grumpier Old Men (1995)|Comedy|Romance
4|Waiting to Exhale (1995)|Comedy|Drama
5|Father of the Bride Part II (1995)|Comedy
6|Heat (1995)|Action|Crime|Thriller
7|Sabrina (1995)|Comedy|Romance
8|Tom and Huck (1995)|Adventure|Children's
9|Sudden Death (1995)|Action

As you can see the type of each movie can vary from 1 type to many...I wonder how could I read those until the end of each line?

I'm currently doing:

void readingenre(string filename,int **g)
{

    ifstream myfile(filename);
    cout << "reading file "+filename << endl;
    if(myfile.is_open())
    {
        string item;
        string name;
        string type;
        while(!myfile.eof())
        {
            getline(myfile,item,'|');
            //cout <<item<< "\t";
            getline(myfile,name,'|');
            while(getline(myfile,type,'|'))
            {
                cout<<type<<endl;
            }
            getline(myfile,type,'\n');
        }
        myfile.close();
        cout << "reading genre file finished" <<endl;
    }
}

the result is not what I want...It looks like:

Animation
Children's
Comedy
2
Jumanji (1995)
Adventure
Children's
Fantasy
3
Grumpier Old Men (1995)
Comedy
Romance

So it doesn't stop at the end of each line...How could I fix this?

weeo
  • 2,619
  • 5
  • 20
  • 29
  • 1
    Read the genre part without specifying a delimiter (i.e. using the default delimiter `'\n'`) and then split the result with `'|'`. – Leon Oct 28 '16 at 10:51
  • The code does exactly what you asked. What do you expect?? – UmNyobe Oct 28 '16 at 10:52
  • @Leon thank you! What function should I use to split the result with '|'? – weeo Oct 28 '16 at 10:56
  • I don't think there is a standard function. Check this: http://stackoverflow.com/questions/236129/split-a-string-in-c – Leon Oct 28 '16 at 10:59
  • Yes this is not a CSV file but it is a delimited file so the same approach works. You just have to change `,` to `|` where appropriate. – NathanOliver Oct 28 '16 at 11:38

1 Answers1

6

Attempting to parse this input file one field at a time is the wrong approach.

This is a text file. A text file consists of lines terminated by newline characters. getline() by itself, is what you use to read a text file, with newline-terminated lines:

while (std::getline(myfile, line))

And not:

while(!myfile.eof())

which is always a bug.

So now you have a loop that reads each line of text. A std::istringstream can be constructed inside the loop, containing the line just read:

   std::istringstream iline(line);

and then you can use std::getline(), with this std::istringstream with the optional delimiter character overriden to '|' to read each field in the line.

Community
  • 1
  • 1
Sam Varshavchik
  • 114,536
  • 5
  • 94
  • 148