我确定这里有一个新手的错误,但我不能为我的生活搞清楚。
我正在尝试使用getline()
读取两个字的行(名字和姓氏),然后将名称排序到结构的成员字段中。但是,getline()
似乎滚过了行的末尾,并将下一行的第一个单词追加到它应该得到的行的最后一个单词。
换句话说,当试图读取一行的最后一个单词时,getline()
正在读取该单词和下一行的第一个单词。
输入文件的格式为:
西雅图水手队 Norichiki Aoki
赛斯史密斯 罗宾逊卡诺
这是我的代码:
struct Player {
string firstName;
string lastName;
float avg;
};
struct Team {
Player roster[8];
string teamName;
};
Team home = {};
stringstream iss;
string token;
string lineread;
while (getline(inFile, lineRead, '\n')){
iss << lineRead;
if (getline(iss, token, ' '))
{
if(s % 2 == 0)
home.roster[s/2].firstName = lineRead;
else
home.roster[s/2].lastName = lineRead;
}
s++;
cout << "token:" << token << endl;
}
我得到的输出看起来像这样:
令牌:西雅图
令牌:MarinersNorichiki
令牌:AokiSeth
令牌:SmithRobinson
但我想要
令牌:西雅图
令牌:水手
令牌:Norichiki
令牌:青木
答案 0 :(得分:1)
std :: cin.getline()会遇到问题。变种强>
getline可以提供第三个参数 - 一个&#34;停止&#34;字符。此字符结束了getline的输入。该字符被吃掉,字符串终止。例: std :: cin.getline(str,100,&#39; |&#39;) 如果没有提供std :: cin.getline(),那么&#34;停止&#34;作为第三个参数的字符,它将在到达换行符时停止。 给出:
float fl;
std::cin >> fl;
char str[101]
std::cin.getline(str, 101);
然后输入:3.14
3.14读入fl。 3.14之后的换行仍然位于输入缓冲区上。 std :: cin.getline(str,101)立即处理仍在输入缓冲区中的换行符。 str变成空字符串。 错觉是应用程序&#34;跳过&#34; std :: cin.getline()语句。
解决方案是添加std :: cin.ignore();紧接着第一个std :: cin语句之后。这将从输入缓冲区中获取一个字符(在本例中为换行符)并将其丢弃。
std :: cin.ignore()可以通过三种不同的方式调用:
答案 1 :(得分:0)
尝试更像这样的东西:
struct Player {
string firstName;
string lastName;
float avg;
};
struct Team {
Player roster[8];
string teamName;
};
Team home = {};
int s = 0;
string line;
while (getline(inFile, line))
{
istringstream iss(line);
iss >> home.roster[s].firstName;
iss >> home.roster[s].lastName;
home.roster[s].avg = ...;
cout << "first: " << home.roster[s].firstName << ", last: " << home.roster[s].lastName << endl;
if (++s == 8) break;
}