如何避免cin.operator>>和getline之间的冲突?

How to avoid conflict between cin.operator>> and getline?

本文关键字:gt 之间 冲突 getline cin 何避免 operator      更新时间:2023-10-16

我只想读取n,然后使用getlinen次数:

#include <iostream>
using namespace std;
int main() {
    int n;
    cin>>n;
    string film;
    for(int i=0;i<n;i++){
        getline(cin,film);
        cout << film;
    }
}

然而,第一部电影总是空荡荡的。亲眼看看。在这种情况下,如何使getline能够容忍默认的cin.operator>>?

将像std::cin >> n这样的格式化输入与像std::getline(std::cin, film)这样的未格式化输入混合的问题是,格式化输入在填充格式时停止,而未格式化输入不会跳过任何空格字符:您观察到的问题是读取n时留下了一个换行符,该换行符被认为是第一个字符串的末尾。解决此问题的最佳方法是使用std::ws操纵器跳过所有前导空白。此外,您应始终验证您的输入是否成功。也就是说,你的代码会变成这样:

#include <iostream>
int main() {
    int n;
    if (std::cin >> n) {
        std::string film;
        std::cin >> std::ws; // not really an input, hence uncheckedd
        for (int i(0); i != n && std::getline(std::cin, film); ++i) {
            std::cout << ''' << film << "'n";
        }
    }
    else  {
        std::cout << "ERROR: failed to read the number of filmsn";
    }
}

如果您真的需要在第一个film的名称中有前导空格,那么您需要更加小心地忽略空格并在第一个换行处停止。那就是你应该使用而不是std::cin >> std::ws

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');

std::numeric_limits(在标头<limits>中声明)的这种有趣使用确保了可以跳过任意数量的空格。您也可以使用一些固定的数字,比如10,但当空格的跳过在这个数字之后停止时,您仍然可能会清空文件。此外,如果你真的在与文件数量相同的行上输入了第一个电影名称,它将被跳过。因此,我认为std::ws的使用效果要好得多。