Как обнаружить пустые строки при чтении из объекта istream в C ++? - PullRequest
10 голосов
/ 11 февраля 2012

Как я могу определить, пуста ли строка?

У меня есть:

1
2
3
4

5

Я читаю это с помощью istream r так:

int n;
r >> n

Я хочу знать, когда я достигну промежутка между 4 и 5. Я попытался прочитать как char и использовать .peek (), чтобы обнаружить \ n, но это обнаруживает \ n, идущий после числа 1.Перевод вышеприведенного ввода: 1 \ n2 \ n3 \ n4 \ n \ n5 \ n, если я прав ...

Поскольку я собираюсь манипулировать int, я скорее читаю их как intsчем использовать getline, а затем конвертировать в int ...

Ответы [ 2 ]

19 голосов
/ 11 февраля 2012

Это может выглядеть так:

#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.

Надеюсь, это поможет.

5 голосов
/ 11 февраля 2012

Если вы действительно не хотите использовать 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', тогда возникнет проблема. Попробуйте прочитать целые строки и затем извлечь из них данные.

...