public member function
<istream> <iostream>

std::basic_istream::tellg

pos_type tellg();
获取输入序列中的位置
返回输入流中当前字符的位置。

内部,该函数通过首先构造一个 sentry 对象(将 noskipws 设置为 true)而不对其进行求值来访问输入序列。然后,如果成员 fail 返回 true,则该函数返回 -1
否则,返回 rdbuf()->pubseekoff(0,cur,in)。最后,在返回前销毁 sentry 对象。

请注意,即使在调用之前设置了 eofbit 标志,该函数也能正常工作。

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

参数



返回值

流中的当前位置。
如果与流关联的 *流缓冲区* 不支持该操作,或者操作失败,则函数返回 -1
成员类型 pos_type 由 *字符特性* 决定:通常,它是一个 fpos 类型(例如 streampos),可以与整数类型相互转换。

错误通过修改 *内部状态标志* 来指示
标志错误
eofbit-
failbit构造 sentry 失败(例如,当调用前的 *流状态* 不是 good 时)。
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;
}

在此示例中,tellg 用于获取流在被 seekg 移动到流末尾后的位置,从而确定文件大小。

数据竞争

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

异常安全

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

另见