c++ getline()不停止在行尾

C++ getline() not stopping at the end of line?

本文关键字:不停止 getline c++      更新时间:2023-10-16

我敢肯定这是新手犯的错误,但我怎么也想不出来。

我试图使用getline()来读取两个单词行(名字和姓氏),然后将名称排序到结构体的成员字段中。然而,getline()似乎滚动过了行尾,并将下一行的第一个单词附加到它应该得到的行的最后一个单词。

换句话说,当试图读取一行的最后一个单词时,getline()正在读取该单词和下一行的第一个单词。

输入文件的格式为:


西雅图水手队Norichiki青木
赛斯史密斯
鲁宾逊卡诺

下面是我的代码:

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
token: SmithRobinson

但是我想要

西雅图

标记:
令牌:水手
令牌:Norichiki
令牌:青木

std::cin.getline()在与std::cin>> var一起使用时可能会出现问题。

getline可以提供第三个参数——一个"停止"字符。这个字符结束getline的输入。字符被删除,字符串被终止。例子:std:: cin。Getline (str, 100, '|')如果std::cin.getline()没有提供"stop"字符作为第三个参数,它将在到达换行符时停止。鉴于:

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()有三种不同的调用方式:

  1. 没有参数:从输入缓冲区中取出一个字符并丢弃:std:: cin.ignore ();//丢弃1个字符
  2. 一个参数:指定的字符数从输入缓冲区中取出并丢弃:std:: cin.ignore (33);//丢弃33个字符
  3. 两个参数:丢弃指定的字符数,或者丢弃不超过并包括指定分隔符的字符(以先到者为准):std:: cin。忽略(26岁,' n ');//忽略26个字符或换行符,以先出现者为准

试试这样做:

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