【发布时间】:2020-04-07 15:40:46
【问题描述】:
案例 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 );
注意事项:
我猜如果我们跳回到已经“从内存中丢弃”(对于 istream)或刷新到磁盘(对于 ostream)的位置,性能可能会受到影响,但我想这无论如何都是罕见的情况。有没有办法防止最坏的情况发生?
我不想(而且基本上不能)使用中间字符串来执行读取或写入操作。
到目前为止,我的代码运行良好,我只是担心它可能会在某些未知情况下崩溃/崩溃
【问题讨论】:
-
取决于流。有些流没有内存。例如,您将一个字节写入电线,它就消失了。您无法将其回调,并且在设备运行几年后,存储通过该线路发送的所有数据可能会非常昂贵。..
-
@user4581301 这就是为什么我专门要求提到的 std::iostreams 。如果给出了 seekg 和 seekp,可以认为可以使用它们。
-
我必须去标准潜水看看是否有保证,但是如果你不能在实际前面的文件流中查找,我有很多代码将无法工作一份文件。请注意,在 Unix 中,文件流可以表示一个串行端口,而最简单的串行端口只是一根电线。
-
狩猎愉快。希望你不必潜入串口,那里的水一定很糟糕。