3

我目前为一些 IO 操作编写了一个类。一些函数返回 IO 操作是否成功。如果我正在读取一个文件,我想知道是否应该返回std::ifstream::good()!std::ifstream::fail()指示 IO 操作是否成功。

差异来自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”位无关。

出于这个原因,您应该始终检查读取操作本身的结果,而不是在读取后检查流标志的状态。

对于所有四种组合的示例:

#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 回答