对于std::ifstream,忽略字符和查找字符有区别吗?
With an std::ifstream, is there a difference between ignoring characters and seeking?
我能找到的所有文档都说 std::basic_istream<>::ignore(n)
"extracts and discards characters",但并不清楚这个提取的含义。
特别是对于 std::ifstream
,实现是否可以使其等同于在文件中简单地 seekg
-ing?如果是这样,主流实现会这样做吗?
否则,如果字符在被丢弃之前确实是 "read",那么当 seekg
可用时(例如,使用文件或字符串流),ignore
似乎是一个糟糕的选择.
是的,有区别。
即使我们只考虑 as-if 规则,提取字符也会对流状态产生影响(考虑各种状态标志),我们可以从 the libstdc++ implementation 中看出流的行为就像调用者使用了提取的字符。
如果有 "optimisation" 完全跳过字符,那么这种可观察到的行为会有所不同。
要应用此 "optimisation" 您应该自己执行 seekg
,注意不要超过流的末尾。
我能找到的所有文档都说 std::basic_istream<>::ignore(n)
"extracts and discards characters",但并不清楚这个提取的含义。
特别是对于 std::ifstream
,实现是否可以使其等同于在文件中简单地 seekg
-ing?如果是这样,主流实现会这样做吗?
否则,如果字符在被丢弃之前确实是 "read",那么当 seekg
可用时(例如,使用文件或字符串流),ignore
似乎是一个糟糕的选择.
是的,有区别。
即使我们只考虑 as-if 规则,提取字符也会对流状态产生影响(考虑各种状态标志),我们可以从 the libstdc++ implementation 中看出流的行为就像调用者使用了提取的字符。
如果有 "optimisation" 完全跳过字符,那么这种可观察到的行为会有所不同。
要应用此 "optimisation" 您应该自己执行 seekg
,注意不要超过流的末尾。