如何在C ++中从istream对象读取时检测空行?

时间:2012-02-10 21:48:41

标签: c++ string input stream istream

如何检测线是否为空?

我有:

1
2
3
4

5

我正在用istream r读这个 这样:

int n;
r >> n

我想知道什么时候到达4到5之间的空间。 我尝试读取为char并使用.peek()来检测\ n但是这会检测到数字1之后的\ n。上面输入的翻译是:1 \ n2 \ n3 \ n4 \ n \ n5 \ n如果我是正确的......

由于我要操作整数,我宁愿将它们作为整数读取而不是使用getline然后转换为int ......

2 个答案:

答案 0 :(得分:18)

看起来像这样:

#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    istringstream is("1\n2\n3\n4\n\n5\n");
    string s;
    while (getline(is, s))
    {
        if (s.empty())
        {
            cout << "Empty line." << endl;
        }
        else
        {
            istringstream tmp(s);
            int n;
            tmp >> n;
            cout << n << ' ';
        }
    }
    cout << "Done." << endl;
    return 0;
}

输出:

1 2 3 4 Empty line.
5 Done.

希望这有帮助。

答案 1 :(得分:5)

如果你真的不想使用getline,这段代码就可以了。

#include <iostream>
using namespace std;


int main()
{
    int x;
    while (!cin.eof())
    {
        cin >> x;
        cout << "Number: " << x << endl;

        char c1 = cin.get();
        char c2 = cin.peek();

        if (c2 == '\n')
        {
            cout << "There is a line" << endl;
        }
    }
}

但请注意,这不是便携式的。当您使用具有与'\ n'不同的结束行字符的系统时,那将是问题。考虑读取整行,然后从中提取数据。