0

指定されたファイルの最後の行を読み取った後にをにifstream設定するのはなぜですか?指定されたファイルが正しく読み取られたかどうかを確認するにはどうすればよいですか?failbit1

bool read_csv_file(const char* filename, vector<string>& lines, bool adding = false)
{
    if( !adding ) lines.clear();

    ifstream csvfile;
    csvfile.open(filename);

    if( csvfile.is_open() )
    {
        string line;
        while( csvfile.good() && getline(csvfile,line) )
        {
            lines.push_back(line);
            cout << "fail: " << csvfile.fail() << endl;
        }
        cout << "fail: " << csvfile.fail() << endl;
        csvfile.close();
        return (!csvfile.fail());
    }

    return false;
}
4

3 に答える 3

2

ファイルの終わりを使い果たした後、フェイルビットが設定されます。それが起こったら、入力操作の結果を解釈しようとしてはいけません。ただし、これはまったく問題なく、読み取るデータがgetlineまだある間は失敗ビットを設定しませんしたがって、次の標準ループはすべての行を抽出します。

for (std::string line; std::getline(csvfile, line); )
{
    // process "line"
}

// all done
于 2013-01-20T23:54:02.790 に答える
1

badbit誤った読み取りをチェックしすぎると、を使用してテストする必要がありますstream.bad()

Failbit操作ロジックの失敗を示し、getlineEOFに達したときに明らかに設定します(私のマシンで確認済み)。

于 2013-01-21T00:04:23.520 に答える
1

最後の行(または任意の行)を読んだ後に設定できる唯一の理由failbitは、ライブラリにエラーがあった場合であり、私はそれを本当に信じていません。が設定されている場合は、何も読んでいないfailbitことを意味します。あなたの場合、ループに入っているときに設定されることはありません。設定されている場合は、に評価され、ループに入ることができませんでした。そしてもちろん、ループは失敗したために正確に終了 します(または失敗します。通常、入力を行う前に テストを 行わ、テストが失敗したかどうかに関係なく、が設定されたと見なします)。getlinefalsegetlinegoodfailbit

この種のものの通常のパターンは次のとおりです。

while ( someInput ) {
    //  ...
}
if ( csvfile.bad() ) {
    //  Serious error (disk read error, etc.)...
} else if ( ! csvfile.eof() ) {
    //  Formatting error...
} else {
    //  Normal end of file...
}

someInputただし、がの場合std::getline()、フォーマットエラーが原因で失敗することはないため、else if上記は当てはまりません(また、多くのコードはハードディスクエラーをファイルの終わりであるかのように扱い、そのif部分も無視します)。

于 2013-01-21T00:20:58.620 に答える