我目前正在为一些IO操作编写一个类。某些函数返回IO操作是否成功。如果我正在读取文件,我想知道是否应该返回std::ifstream::good()
或!std::ifstream::fail()
以指示IO操作是否成功。
差异来自eof
位,我不确定我是否正确理解它。
假设我有一个包含4个字节的二进制文件(1个整数)。
假设我读了这个整数。
我的问题是:在此操作之后或下一次IO操作之后(将失败)是否会设置eof
标志?
如果在此操作后直接设置,如果我的读取函数返回std::ifstream::good()
,则结果将为false
(但正确读取整数)。
你可以在设置eof位时解释我吗?在我的函数结束时我应该返回什么?
答案 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()
,该操作告知是否设置了任何错误标志。