9

std::ifstream を使用して次の行を検出して移動するにはどうすればよいですか?

void readData(ifstream& in)
{
    string sz;
    getline(in, sz);
    cout << sz <<endl;
    int v;
    for(int i=0; in.good(); i++)
    {
        in >> v;
        if (in.good())
            cout << v << " ";
    }
    in.seekg(0, ios::beg);
    sz.clear();
    getline(in, sz);
    cout << sz <<endl; //no longer reads
}

エラーが発生した場合は教えてくれると思いますが、エラーが発生するとストリームは機能しなくなります。別のintを読み取る前に、行末にいるかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

19

次の行まですべてを無視するには、ignore() を使用します。

 in.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

手動で行う必要がある場合は、他の文字をチェックして「\ n」かどうかを確認してください

char next;
while(in.get(next))
{
    if (next == '\n')  // If the file has been opened in
    {    break;        // text mode then it will correctly decode the
    }                  // platform specific EOL marker into '\n'
}
// This is reached on a newline or EOF

不良ビットをクリアする前にシークを行っているため、これはおそらく失敗しています。

in.seekg(0, ios::beg);    // If bad bits. Is this not ignored ?
                          // So this is not moving the file position.
sz.clear();
getline(in, sz);
cout << sz <<endl; //no longer reads
于 2009-01-25T15:33:09.863 に答える
3

in.clear();ループ後にストリームのエラー状態をクリアする必要があります。その後、ストリームはエラーが発生しなかったかのように再び機能します。

ループを次のように単純化することもできます。

while (in >> v) {
  cout << v << " ";
}
in.clear();

操作が成功するとストリーム抽出が返されるため、明示的にチェックせずにこれを直接テストできますin.good();

于 2009-01-25T09:06:48.483 に答える