我正在为学校开展一个项目,其中我们要做的一部分就是以团队名称的形式保存数据,然后将几个整数转换为.dat
文件,并在程序是下一次运行。
注意:counter是一个变量,用于记录文件中存在的团队数量,在此实例中设置为3
void load(int counter)
{
ifstream infile("saveFile.dat");
string temp[25];
int temp2[25][8];
for (int i = 0; i < counter; i ++)
{
getline(infile, temp[i]);
for (int j = 0; j < 7; j++)
{
infile >> temp2[i][j];
}
}
cout << counter;
for (int i = 0; i < counter; i++)
{
string name = temp[i];
int gamesPlayed = temp2[i][0], wins = temp2[i][1], draws = temp2[i]
[2], losses = temp2[i][3],
goalsFor = temp2[i][4], goalsAgainst = temp2[i][5], points =
temp2[i][6];
CFootballTeam t(name, gamesPlayed, wins, draws, losses, goalsFor,
goalsAgainst, points);
table[i] = t;
}
}
这是我的加载功能看起来像但它似乎卡在文件的第二行,并返回一个空格,然后为每个团队返回-858993460后,第一次提示它没有读取任何数据,即使数据是现在,这是我的saveFile.dat文件的内容:
Manchester United
3 4 4 4 5 4 5
Manchester City
3 4 4 4 4 4 5
Chelsea
4 4 4 4 4 4 5
有谁能告诉我如何让程序继续阅读其余的部分,而不仅仅是第1行和第2行?
由于
答案 0 :(得分:1)
问题在于你没有阅读你期望的内容。执行getline()
时,程序会读取流中的所有内容,直到它到达\n
,然后丢弃它。执行>>
时,它会一直读到白色空间,但会在流中留下空白区域。这意味着当你完成第一次迭代时,你就拥有了一切,但是在最后>>
,你将离开\n
字符。然后当你执行下一个getline()
时,它会读入\n
,给出一个空字符串,然后对文本执行>>
,并且不再将所有内容都放在正确的变量中。您的输入看起来像这样:
Original Data
Manchester United\n
3 4 4 4 5 4 5\n
Manchester City\n
3 4 4 4 4 4 5\n
Chelsea\n
4 4 4 4 4 4 5\n
After getline()
3 4 4 4 5 4 5\n
Manchester City\n
3 4 4 4 4 4 5\n
Chelsea\n
4 4 4 4 4 4 5\n
After >>
\n
Manchester City\n
3 4 4 4 4 4 5\n
Chelsea\n
4 4 4 4 4 4 5\n
这意味着编译器可能会将值设置为某个默认值,在您的情况下,它看起来像是最小值。您需要做的是在每次迭代结束时添加inFile.ignore()
以从整数行的末尾清除\n
。