一、文件光标定位streampos
在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。
- ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置;
- ofstream 类和 fstream 类有 seekp 成员函数,可以设置文件写指针的位置;
- ostream & seekp (int offset, int mode);
- istream & seekg (int offset, int mode);
- mode 代表文件读写指针的设置模式,有以下三种选项:
- ios::beg:让文件读指针(或写指针)指向从文件开始向后的 offset 字节处。offset 等于 0 即代表文件开头。在此情况下,offset 只能是非负数。
- ios::cur:在此情况下,offset 为负数则表示将读指针(或写指针)从当前位置朝文件开头方向移动 offset 字节,为正数则表示将读指针(或写指针)从当前位置朝文件尾部移动 offset字节,为 0 则不移动。
- ios::end:让文件读指针(或写指针)指向从文件结尾往前的 |offset|(offset 的绝对值)字节处。在此情况下,offset 只能是 0 或者负数。
所谓“位置”,就是指距离文件开头有多少个字节。文件开头的位置是 0。
此外,我们还可以得到当前读写指针的具体位置:
- ifstream 类和 fstream 类还有 tellg 成员函数,能够返回文件读指针的位置;
- ofstream 类和 fstream 类还有 tellp 成员函数,能够返回文件写指针的位置;
- int tellg();
int tellp();
1、streampos是在stream中的 绝对位置,非负,看成int即可
2、streamoff是与stream中指定点的相对位置,可为负数
3、tellg/tellp 返回值是streampos,返回的是与stream起点的距离
4、seekg/seekp如果有两个 输入参数,那么第一个参数类型为streamoff
二、例子:如何获取文件长度
1、seekg将文件的读指针,定位到文件尾部;
2、tellg获取 读指针 位置,此位置即为文件长度。