public member function
<ostream> <iostream>

std::basic_ostream::seekp

(1)
basic_ostream& seekp (pos_type pos);
(2)
basic_ostream& seekp (off_type off, ios_base::seekdir way);
设置输出序列中的位置
设置下一个字符将被插入到输出流中的位置。

内部地,如果成员 fail 返回 true,则函数返回。
否则,它调用其关联的 *流缓冲区* 对象(如果存在)上的 pubseekpos *(1)pubseekoff *(2)
内部地,函数首先构造一个不评估的 sentry 对象来访问输出序列。然后,如果成员 fail 返回 true,则函数返回。
否则,它调用其关联的 *流缓冲区* 对象(如果存在)上的 pubseekpos *(1)pubseekoff *(2)
最后,它在返回之前销毁 sentry 对象。

请注意,即使 eofbit 标志在调用前已被设置,该函数也能正常工作,但它不会修改该标志。

参数

pos
在流内的新的绝对位置(相对于开头)。
*字符特性* 确定成员类型 pos_type:通常,它是一个 fpos 类型(例如 streampos),可以与整数类型相互转换。
off
偏移量,相对于 way 参数。
成员类型 off_type 由 *字符特性* 确定:通常,它是已签名整型 streamoff 的别名。
way
类型为 ios_base::seekdir 的对象。它可以接受以下任何常量值
偏移量相对于...
ios_base::beg流的开头
ios_base::cur流中的当前位置
ios_base::end流的末尾

返回值

basic_ostream 对象(*this)。

错误通过修改 *内部状态标志* 来指示
flagerror
eofbit-
failbit内部调用 *(1) 中的 pubseekpos 失败(当 sentry 的构造失败时也可能设置该标志)。
badbit流上发生了其他错误(例如,当函数捕获由内部操作抛出的异常时)。
当设置此标志时,流的完整性可能受到影响。
flagerror
eofbit-
failbit内部调用 pubseekpospubseekoff 失败(当 sentry 的构造失败时也可能设置该标志)。
badbit流上发生了其他错误(例如,当函数捕获由内部操作抛出的异常时)。
当设置此标志时,流的完整性可能受到影响。
一次操作可能会设置多个标志。

如果操作设置了一个已通过成员 exceptions 注册的 *内部状态标志*,则函数将抛出成员类型为 failure 的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// position in output stream
#include <fstream>      // std::ofstream

int main () {

  std::ofstream outfile;
  outfile.open ("test.txt");

  outfile.write ("This is an apple",16);
  long pos = outfile.tellp();
  outfile.seekp (pos-7);
  outfile.write (" sam",4);

  outfile.close();

  return 0;
}

在此示例中,tellp 用于获取写操作后流中的位置。然后,指针向前移动 7 个字符以在该位置修改文件,因此文件的最终内容为
This is a sample


数据竞争

修改流对象。
并发访问同一个流对象可能导致数据争用。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果生成的 *错误状态标志* 不是 goodbit 并且成员 exceptions 被设置为针对该状态抛出,则它会抛出成员类型为 failure 的异常。
由内部操作引起的任何异常都会被函数捕获并处理,设置 badbit。如果在上一次调用 exceptions 时设置了 badbit,则函数会重新抛出捕获到的异常。

另见