2

以下は、ファイルの終わりを超えて読み取られるまでfile.eof()明らかに戻らないため、バグを引き起こします。trueこれをどのように行うべきですか?

std::ifstream file("something.stuff", std::ios::in|std::ios::binary);

while(!file.eof())
{
    double x, y, z;
    file.read(reinterpret_cast<char*>(&x), sizeof(x));  //  Do I need to check if(file) after every read?
    file.read(reinterpret_cast<char*>(&y), sizeof(y));
    file.read(reinterpret_cast<char*>(&z), sizeof(z));

    // Do something with xyz
}
4

4 に答える 4

9

部分的なデータで何かをするつもりがない限り、すべての読み取りの後でそれをチェックすることができます。

while(true)
{
    double x, y, z;
    file.read(reinterpret_cast<char*>(&x), sizeof(x));
    file.read(reinterpret_cast<char*>(&y), sizeof(y));
    file.read(reinterpret_cast<char*>(&z), sizeof(z));

    if (!file)
        break;

    // Do something with xyz
}
于 2012-07-01T18:37:19.143 に答える
1

std::ifstream::readeofファイルの終わりを超えて読み取ったら、フラグを設定する必要があります。

したがって、はい、をfile.eof()呼び出すたびに確認する必要がありますfile.read()

于 2012-07-01T18:34:00.427 に答える
1

または、seek and tellを使用してファイルの長さを事前に見つけてから、実行する必要のある反復回数を計算します。そうすれば、読み取るたびにeofビットをチェックし続ける必要がありません。

于 2012-07-01T18:35:33.923 に答える
1

はい、各読み取り中にストリームの終わりに到達する可能性があるため、続行する前に、それぞれが成功するかどうかを確認する必要があります

std::ifstream file("something.stuff", std::ios::in|std::ios::binary); 

while(!file.eof()) 
{ 
    double x, y, z; 
    if (!file.read(reinterpret_cast<char*>(&x), sizeof(x)) ||
        !file.read(reinterpret_cast<char*>(&y), sizeof(y)) ||
        !file.read(reinterpret_cast<char*>(&z), sizeof(z)))
    {
        // failure... perhaps check file.eof() and/or file.fail() for precise condition
        break;
    }
    else 
    {
        // Do something with xyz 
    }
}
于 2012-07-01T18:39:11.977 に答える