0

ファイルからすべてのintを読み取るこの関数があります。問題は、文字を読むときに新しい行をトリガーし、常に行末ではなく 1 ずつシークすることです。この関数をより適切に記述するにはどうすればよいですか?

int v;
    while (!in.eof())
    {
        while (in >> v)
            cout << v << " ";

        cout << endl;
        if (in.eof())
            break;
        in.clear();
        in.seekg(1, ios::cur);
        int a;
        a=0;
    }
4

2 に答える 2

3

ファイルが空白 (改行を含む) で区切られた int のみで構成されている場合は、これで十分です。

while( in >> v )
{
    // do something with v
}

ファイルの後、in.fail() が false で in.eof() が true の場合、フォーマット エラーなしでファイルの終わりに到達しました。それ以外の場合、int の読み取りエラーが発生しました。

無効な入力を受け取り、そこから回復したい場合は、どのように回復したいかを考え出す必要があります。行末までスキップして解析をやり直したい場合は、このようなものを使用できます。

in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
于 2009-01-25T09:44:00.920 に答える
1

上記のコードの最初の問題は、行末で停止しません。operator>>()は、改行文字を含む「空白文字
」を 無視します。

これはどうすればもっとうまく書けるでしょうか?
数字で何をしようとしているのか、ファイルの入力形式が何であるかを知らずに、それを伝えるのは難しいです!

しかし、私がこれを書いているなら、これらの行を使わずに書くでしょう:

    if (in.eof())
            break;
    in.clear();
    in.seekg(1, ios::cur);

フォーマットされたテキスト ファイルを処理する場合、seek() が使用されることはほとんどありません。

想定:
ファイルには数字のみが含まれています。
すべての数値をコンテナーに読み込みます。

std::vector<int>    data;

std::copy(  std::istream_iterator<int>(in),  // An iterator from current point
            std::istream_iterator<int>(),    // To end of file.
            std::inserter(data)              // Destination (insert into data)
         );
于 2009-01-25T15:49:05.073 に答える