こんにちは、このようなファイルを読む必要があります...
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フィールドずつ解析しようとするのは、間違ったアプローチです。
これはテキストファイルです。テキストファイルは、改行文字で終了する行で構成されます。 getline()
自体は、改行で終了する行を含むテキストファイルの読み取りに使用します。
_while (std::getline(myfile, line))
_
ではなく:
_while(!myfile.eof())
_
これで、テキストの各行を読み取るループができました。 _std::istringstream
_は、ループ内で作成でき、読み取った行を含みます。
_ std::istringstream iline(line);
_
そして、std::getline()
を使用し、この_std::istringstream
_でオプションの区切り文字を_'|'
_にオーバーライドして、行の各フィールドを読み取ることができます。
みんなありがとう... istringstreamを使った。できます。
getline(myfile,type);
istringstream ss(type);
string temp;
while(getline(ss,temp,'|'))
{
cout<<temp<<endl;
}