C ++如何读取带分隔符的行直到每行结束?

时间:2016-10-28 10:49:04

标签: c++ getline

您好,我需要阅读一个看起来像这样的文件......

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

正如你所看到的,每部电影的类型可以从1种到多种不等......我想知道在每行结束之前我怎么能读到这些?

我现在正在做:

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;
    }
}

结果不是我想要的......看起来像是:

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

所以它并没有停在每一行的末尾......我怎么能解决这个问题呢?

1 个答案:

答案 0 :(得分:4)

尝试一次解析一个字段的输入文件是错误的方法。

这是一个文本文件。文本文件由换行符终止的行组成。 getline()本身就是您用来读取文本文件的内容,使用换行符终止行:

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

而不是:

while(!myfile.eof())

which is always a bug

所以现在你有一个循环读取每行文本。可以在循环内部构造std::istringstream,其中包含刚刚读取的行:

   std::istringstream iline(line);

然后您可以使用std::getline(),使用此std::istringstream,并将可选的分隔符字符覆盖到'|',以读取该行中的每个字段。