質問

ファイルからすべての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;
    }
役に立ちましたか?

解決

ファイルが改行(を含む)で区切られた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' );

他のヒント

最初の問題は、上記のコードが行末で停止しないことです。
operator <!> gt; <!> gt;()は<!> quot; White Space Characters <!> quot;を無視します。改行文字が含まれます。

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

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

    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)
         );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top