【发布时间】:2011-08-11 20:40:53
【问题描述】:
我想测试一个std::istream 是否已经到达末尾而不读取它。
我知道我可以像这样检查 EOF:
if (is >> something)
但这有一系列问题。想象一下,有许多(可能是虚拟的)方法/函数期望 std::istream& 作为参数传递。
这意味着我必须做“家务”来检查它们中的 EOF,可能使用不同类型的 something 变量,或者创建一些奇怪的包装器来处理调用输入法的场景。
我需要做的就是:
if (!IsEof(is)) Input(is);
方法IsEof应该保证流不被改变读取,这样上面的行就相当于:
Input(is)
关于Input方法中读取的数据。
如果没有适用于和std::istream 的通用解决方案,有没有办法为std::ifstream 或cin 做到这一点?
编辑:
换句话说,下面的assert 应该总是通过:
while (!IsEof(is)) {
int something;
assert(is >> something);
}
【问题讨论】:
-
重新阅读问题,我不确定我第一次理解。你的意思是
if (IsEof(is)) Input(is)还是应该有一个逻辑非? -
这应该是不合逻辑的。但重要的是我需要先检查而不消耗任何令牌(请参阅上面的编辑),一切都会对你很清楚。
-
断言非常强大的后期编辑。它指出
IsEof只有在格式化提取int会成功时才返回 false。你确定这是你的意思吗?如果是这样,您不能使用原始istream执行此操作;您将需要某种结构化缓存,以便您可以读取和缓存下一个 int。或者,您需要一种方法来放回在解析int时读取的所有字符,而std::istream并不能保证这总是可行的。 -
这个
int只是一个例子,无论下一个令牌是什么,只要达到EOF,我都希望它能够工作。是的,我正在寻找一个函数,它可以告诉我是否到达流中最后一个标记(即 EOF)之后的位置,而不尝试读取下一个标记,或者至少提前读取它并将其放回原处。这可能吗? -
只是为了澄清,你所说的“令牌”到底是什么意思?如果您谈论的是任意复杂的类型,那么-大概-下一个“令牌”可能包含任意多个字符,您将不得不尝试对整个对象进行虚假读取。如果此读取失败,您将不得不将已读取的所有内容存储在缓存中(可能是结构化的,也可能不是),因为您通常无法将其全部推回一个简单的
istream。
标签: c++ filestream iostream eof