web-dev-qa-db-ja.com

C ++各行の終わりまで区切り文字で行を読む方法は?

こんにちは、このようなファイルを読む必要があります...

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

だから、各行の終わりで停止しません...これを修正するにはどうすればよいですか?

5
weeo

この入力ファイルを一度に1フィールドずつ解析しようとするのは、間違ったアプローチです。

これはテキストファイルです。テキストファイルは、改行文字で終了する行で構成されます。 getline()自体は、改行で終了する行を含むテキストファイルの読み取りに使用します。

_while (std::getline(myfile, line))
_

ではなく:

_while(!myfile.eof())
_

これは常にバグです

これで、テキストの各行を読み取るループができました。 _std::istringstream_は、ループ内で作成でき、読み取った行を含みます。

_   std::istringstream iline(line);
_

そして、std::getline()を使用し、この_std::istringstream_でオプションの区切り文字を_'|'_にオーバーライドして、行の各フィールドを読み取ることができます。

4
Sam Varshavchik

みんなありがとう... istringstreamを使った。できます。

getline(myfile,type);
istringstream ss(type);
string temp;
while(getline(ss,temp,'|'))
{
     cout<<temp<<endl;
}
0
weeo