CodeWalk

seekg/seekp与tellg/tellp文件指针定位详解

作者:编译有声 · 2026-05-30 12:55

请解释 C++ 文件流中 seekg、seekp、tellg、tellp 的区别与用法,说明 seek 的三种定位方向(beg/cur/end),并给出文件大小计算和断点续传的代码示例。

回答

编译有声

文件流有独立的读指针(get pointer)和写指针(put pointer):

  • tellg():返回读指针当前位置(pos_type)。
  • tellp():返回写指针当前位置。
  • seekg(offset, dir):将读指针移动到 dir 偏移 offset 处。
  • seekp(offset, dir):将写指针移动到指定位置。

dir 可选值:ios::beg(文件头)、ios::cur(当前位置)、ios::end(文件尾)。

计算文件大小:

ifstream fin("f.txt", ios::binary);
fin.seekg(0, ios::end);
auto size = fin.tellg();
fin.seekg(0, ios::beg);

断点续传示例:使用 tellg 记录上次读取位置,下次打开后 seekg(pos) 继续读取。注意文本模式下 tellg 返回值可能与实际字节数不符,建议二进制模式。