C ++ getline()不会在行尾停止?

时间:2016-08-26 22:29:43

标签: c++ newline delimiter getline

我确定这里有一个新手的错误,但我不能为我的生活搞清楚。

我正在尝试使用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
  令牌:青木

2 个答案:

答案 0 :(得分:1)

当与std :: cin&gt;&gt;一起使用时,

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. 无参数:从输入缓冲区中取出一个字符并丢弃: 的std :: cin.ignore(); //丢弃1个字符
  2. 一个参数:指定的字符数从输入缓冲区中获取并丢弃: 的std :: cin.ignore(33); //丢弃33个字符
  3. 两个参数:丢弃指定的字符数,或丢弃包含指定分隔符的字符(以先到者为准): std :: cin.ignore(26,&#39; \ n&#39;); //忽略26个字符或换行符(以先到者为准)

答案 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;
}