在溪流中跳回安全吗? (std::ifstream, std::ofstream)

Is jumping back in streams safe? (std::ifstream, std::ofstream)

情况 A。我需要在 istream 中寻找一些东西,然后可能会跳回去重新开始。

情况 B。我需要写入 ostream,然后有时会跳回一些字符以覆盖内容。

以下代码安全吗? (即保证不崩溃)

// Case A
std::ifstream Stream; // or std::istringstream Stream
// save position
auto initial_position = Stream.tellg();
// Read some characters
while ( ... ) { Stream.get(); ... }
// jump back
Stream.seekg( initial_position );
// Case B
std::ofstream Stream; // or std::ostringstream Stream
// save position
auto initial_position = Stream.tellp();
// Write some characters
while ( ... ) { Stream.put(); ... }
// jump back
Stream.seekp( initial_position );

备注:

  1. 我想如果我们跳回到已经 'discarded from memory'(对于 istream)或刷新到磁盘(对于 ostream)的位置,性能可能会受到影响,但我想这是罕见的无论如何。有没有办法防止最坏的情况发生?

  2. 我不想(基本上不能)使用中间字符串进行读取或写入。

  3. 到目前为止,我的代码对我所做的一切都运行良好,我只是担心它可能 break/crash 在某些未知情况下

将其称为流是有原因的 - 您只能读取或写入一次。如 "No man ever steps in the same river twice, for it's not the same river and he's not the same man."(将 "river" 替换为 "stream")。

由文件支持的流确实提供随机访问,但这更像是一个例外。此外,文件可能会在您阅读时被截断 and/or 重写,因此您可能无法在刚刚阅读的文件流中向后或向前搜索。

最实用的解析算法只会按顺序检查输入的每个字节一次 - 这使得它们适用于任何流,例如文件、管道、套接字。您可能喜欢以这种方式实现您的解析。

还有其他解析算法在可以来回查找输入时效率最高。对于这些算法,首选方法是将整个文件或文件的特定部分映射到内存中。