因为来自文件的数据如下所示:第1行是名称(第一个最后一个),下一行是得分(得分1得分2 ……得分5)等等……所以我认为我需要getline for name和>> ;得分
数据文件的示例
David Beckham
80 90 100 20 50
Ronaldinho Gaucho
99 80 100 20 60
....
首先,我有结构
struct Player {
string name;
int score[5];
} player[size]
从文件中读取数据时
int i = 0;
while(!file.eof())
{
for (int j = 0; j < 2; j++) //read each 2 two lines
{
if(j==0) // name
{
getline(file, player[i].name);
}
else if(j==1) // score
{
for(int k=0; k<5; k++) file >> player[i].grade[k];
}
}
i++; //move to next player
}
问题是在读完所有分数(第一个玩家)之后,似乎没有去下一行继续读下一个名字,那里有点乱.那么有任何建议来纠正我的代码或新想法吗?
解决方法:
在读完最后一个分数后,换行符仍然位于输入缓冲区上.你需要跳过它. ignore
功能对此非常有用.
getline(file, player[i].name);
for (int k = 0; k < 5; ++k)
file >> player[i].grade[k];
file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
根据需要检查错误. >> operator,getline和ignore all返回流引用,您可以检查是否成功.
因为每次迭代都完全不同,所以不需要j循环.只需写入j = 0的情况,然后立即执行j = 1的情况,然后摆脱循环,就像上面的代码一样. (并注意j在循环内永远不会等于2,所以无论如何你的情况都是错的.)