web-dev-qa-db-ja.com

C ++で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私が正しい場合...

Intを操作するので、getlineを使用してintに変換するのではなく、intとして読み取ります...

12
bb2

次のようになります。

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

お役に立てれば。

20
LihO

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」と異なるシステムを使用している場合、問題が発生します。行全体を読み取ってからデータを抽出することを検討してください。

6
gumik