public member function
<istream> <iostream>

std::basic_istream::seekg

(1)
basic_istream& seekg (pos_type pos);
(2)
basic_istream& seekg (off_type off, ios_base::seekdir way);
设置输入序列中的位置
设置从输入流中提取的下一个字符的位置。

在内部,该函数首先构造一个 sentry 对象(将 noskipws 设置为 true)来访问输入序列。然后(如果 good),它在其关联的 流缓冲区 对象(如果有)上调用 pubseekpos (1)pubseekoff (2)。最后,在返回之前销毁 sentry 对象。

如果在调用之前设置了 eofbit 标志,则函数失败(设置 failbit 并返回)。
该函数会清除在调用之前设置的 eofbit 标志。

调用此函数不会改变 gcount 返回的值。

参数

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

返回值

*thisbasic_istream 对象。

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

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main () {
  std::ifstream is ("test.txt", std::ifstream::binary);
  if (is) {
    // get length of file:
    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);

    // allocate memory:
    char * buffer = new char [length];

    // read data as a block:
    is.read (buffer,length);

    is.close();

    // print content:
    std::cout.write (buffer,length);

    delete[] buffer;
  }

  return 0;
}

在此示例中,seekg 用于将位置移到文件末尾,然后移回开头。

数据竞争

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

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果结果的 错误状态标志 不是 goodbitexceptions 的该状态设置为抛出,则抛出类型为 failure 的异常。
内部操作抛出的任何异常都会被函数捕获和处理,并设置 badbit。如果在最后一次调用 exceptions 时设置了 badbit,则函数将重新抛出捕获的异常。

另见