web-dev-qa-db-fra.com

Comment détecter les lignes vides lors de la lecture d'un objet istream en C ++?

Comment puis-je détecter si une ligne est vide?

J'ai:

1
2
3
4

5

Je lis ceci avec istream r donc:

int n;
r >> n

Je veux savoir quand j'atteins l'espace entre 4 et 5. J'ai essayé de lire en tant que caractère et d'utiliser .peek () pour détecter\n mais cela détecte le\n qui va après le numéro 1. La traduction de l'entrée ci-dessus est: 1\n2\n3\n4\n\n5\n si j'ai raison ...

Puisque je vais manipuler les entiers, je préfère les lire comme des entiers que d'utiliser getline puis de les convertir en int ...

12
bb2

Cela pourrait ressembler à ceci:

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

production:

1 2 3 4 Empty line.
5 Done.

J'espère que cela t'aides.

20
LihO

Si vous ne voulez vraiment pas utiliser getline, ce code fonctionne.

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

Mais sachez que ce n'est pas portable. Lorsque vous utilisez un système qui a des caractères de fin de ligne différents de '\ n', cela pose un problème. Pensez à lire des lignes entières, puis à en extraire des données.

6
gumik