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

标签 c++ newline delimiter getline

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

我正在尝试使用 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() 可以三种不同的方式调用:

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

关于C++ getline() 不在行尾停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39175459/

相关文章:

c++ - 如何在 C++ 中编程为接口(interface)/抽象类?

sql - 用分隔符分隔字符串并分配给变量 - sql

c - 遇到换行符时标记字符串 - 不工作换行符无法被识别

php - Python 一个打印命令两个变量输出两条不同的行到屏幕

sql-server - 基于分隔符的 SQL 拆分,只保留第二个元素

java - 有什么方法可以使用带有两对不同分隔符的正则表达式吗?

c++ - 类成员函数中的静态本地在类重新分配后仍然存在?

c++ - 将 unique_ptr 重置为字符数组

c++ - 推力 vector 距离计算

excel - 在 Excel 2007 中导入带换行符的 CSV