【问题标题】:C++ getline() not stopping at the end of line?C++ getline() 不在行尾停止?
【发布时间】:2017-01-03 16:00:49
【问题描述】:

我确定这里有一个新手错误,但我终生无法弄清楚。

我正在尝试使用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
代币:史密斯罗宾逊

但我想拥有

代币:西雅图
代币:水手
代币:Norichiki
代币:青木

【问题讨论】:

  • 您的问题与getline()的使用无关。您期望的输出需要stringstreams 操作员&lt;&lt; 来清除以前的内容。它没有。
  • 为什么要使用两次 getline。 s 变量是什么?请包含所有相关代码。

标签: c++ newline delimiter getline


【解决方案1】:

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

  1. 无参数:从输入缓冲区中取出单个字符并丢弃: std::cin.ignore(); //丢弃1个字符
  2. 一个参数:指定的字符数取自输入缓冲区并丢弃: 标准::cin.ignore(33); //丢弃 33 个字符
  3. 两个参数:丢弃指定的字符数,或丢弃直到并包括指定分隔符的字符(以先到者为准): std::cin.ignore(26, '\n'); //忽略 26 个字符或换行,以先到者为准

【讨论】:

    【解决方案2】:

    试试类似的方法:

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

    【讨论】:

    • 谢谢雷米。非常感谢
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2023-03-18
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多