eof位:读取失败之前或之后?

时间:2012-09-30 20:30:25

标签: c++ io stream ifstream eof

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

差异来自eof位,我不确定我是否正确理解它。

假设我有一个包含4个字节的二进制文件(1个整数)。

假设我读了这个整数。

我的问题是:在此操作之后或下一次IO操作之后(将失败)是否会设置eof标志?

如果在此操作后直接设置,如果我的读取函数返回std::ifstream::good(),则结果将为false(但正确读取整数)。

你可以在设置eof位时解释我吗?在我的函数结束时我应该返回什么?

3 个答案:

答案 0 :(得分: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)) { }
}

答案 1 :(得分: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

答案 2 :(得分:0)

在下一次IO操作(将失败)'后设置eof标志。您应该在读取操作之后返回std::ifstream::good(),该操作告知是否设置了任何错误标志。