我敢肯定这里有一个新手错误,但我终究无法弄清楚。
我正在尝试使用 getline()
来读取一个两字行(名字和姓氏),然后将这些名字分类到结构的成员字段中。但是,getline()
似乎滚动到行尾并将下一行的第一个单词附加到它应该获取的行的最后一个单词。
换句话说,当试图读取一行的最后一个单词时,getline()
正在读取该单词和下一行的第一个单词。
输入文件的格式是:
Seattle Mariners
Norichiki Aoki
Seth Smith
Robinson Cano
这是我的代码:
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;
}
我得到的输出看起来像这样:
token: Seattle
token: MarinersNorichiki
token: AokiSeth
token: SmithRobinson
但我想拥有
token: Seattle
token: Mariners
token: Norichiki
token: Aoki
最佳答案
std::cin.getline() 在与 std::cin >> var. 一起使用时可能会遇到问题。
getline 可以提供第三个参数——一个“停止”字符。该字符结束 getline 的输入。字符被吃掉,字符串终止。例子: std::cin.getline(str, 100, '|') 如果 std::cin.getline() 没有提供“停止”字符作为第三个参数,它将在到达换行符时停止。 鉴于:
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 变为空字符串。 错觉是应用程序“跳过”了 std::cin.getline() 语句。
解决方案是添加 std::cin.ignore();紧接在第一个 std::cin 语句之后。这将从输入缓冲区中抓取一个字符(在本例中为换行符)并将其丢弃。
std::cin.ignore() 可以三种不同的方式调用:
- 无参数:单个字符从输入缓冲区中取出并丢弃: std::cin.ignore();//丢弃1个字符
- 一个参数:指定的字符数从输入缓冲区中取出并丢弃: std::cin.ignore(33);//丢弃33个字符
- 两个参数:丢弃指定数量的字符,或丢弃直到并包括指定分隔符的字符(以先到者为准): std::cin.ignore(26, '\n');//忽略26个字符或换行,以先到者为准
关于C++ getline() 不在行尾停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39175459/