3

現在、いくつかの IO 操作のクラスを作成しています。一部の関数は、IO 操作が成功したかどうかを返します。ファイルを読んでいる場合、IO 操作が成功したかどうかを返すstd::ifstream::good()必要があるのか​​ 、それとも示す必要があるのか​​ 疑問に思います。!std::ifstream::fail()

違いはeofビットから来ており、正しく理解しているかどうかはわかりません。

4 バイト (1 整数) のバイナリ ファイルがあるとします。

この整数を読み取ったとします。

私の質問は次のとおりです。eofフラグは、この操作の後、または次の IO 操作 (失敗する) の後に設定されますか?

この操作の直後に設定した場合、読み取り関数が を返す場合std::ifstream::good()、結果は次のようになりますfalse(ただし、整数は正しく読み取られました)。

eof ビットがいつ設定され、関数の最後に何を返せばよいか説明してもらえますか?

4

3 に答える 3

5

ストリームの最後を読み込もうとすると、EOF フラグが設定されます。

関数は元のストリームへの参照を返す必要があり、次のようにループまたは条件で使用する必要があります。

std::istream & process(std::istream & is)
{
    int n;
    if (is >> n) { std::cout << "Read one int: " << n << "\n"; }
    return is;
}

int main()
{
    std::ifstread infile("data.bin");

    while (process(infile)) { }
}
于 2012-09-30T20:41:57.620 に答える
5

ストリームの「eof」ビットは、読み取り操作がストリームの末尾を超えて読み取ろうとすると設定されます。ストリームの末尾を超えて読み取る読み取り操作は、成功する場合と失敗する場合があります。これは、「eof」ビットが設定されているかどうかとは無関係です。

このため、常に読み取り操作自体の結果を確認し、読み取り後のストリーム フラグの状態を確認しないでください。

4 つの組み合わせすべての例:

#include <iostream>
#include <istream>

int main()
{
        int n;
        if (std::cin >> n)
                std::cout << "read an int with value = " << n << '\n';
        else
                std::cout << "read of int failed\n";

        std::cout << "cin.eof() = " << std::cin.eof() << '\n';
        return 0;
}

eof ビットを設定する読み取りの成功:

$ printf 1 | ./a.out
read an int with value = 1
cin.eof() = 1

eof ビットを設定しない読み取りの成功:

$ echo 1 | ./a.out
read an int with value = 1
cin.eof() = 0

eof ビットを設定しない読み取りの失敗:

$ printf abc | ./a.out
read of int failed
cin.eof() = 0

eof ビットを設定する失敗した読み取り:

$ echo | ./a.out
read of int failed
cin.eof() = 1
于 2012-09-30T21:08:46.493 に答える
0

eof フラグは、「(失敗する) 次の IO 操作の後」に設定されます。std::ifstream::good()エラーフラグが設定されているかどうかを示す読み取り操作の後に戻る必要があります。

于 2012-09-30T20:31:53.267 に答える