今天心血来潮,想搞搞文件操作,琢磨着怎么在文件里头“跳来跳去”地读取内容。这就不得不提C++里的一个函数:seekg
。这名字,"seek" মানে 寻找,"g" মানে "get",合起来就是“去找然后拿”,挺形象的。
实践开始
我有点懵,不知道咋下手。于是我就上网查查,发现seekg
这玩意儿主要是用来设置文件输入流的位置,说白就是让你可以指定从文件的哪个地方开始读数据。
找到的资料里提到它的两种用法:
seekg(streampos pos)
:这种是直接跳到文件里头的某个特定位置。seekg(streamoff off, ios_base::seekdir way)
:这种就稍微复杂点,可以从文件开头、当前位置或者文件末尾,根据给定的偏移量来移动。
我寻思着,先试试第一种,直接跳到一个位置看看。
我创建一个文本文件,随便写点内容,然后用C++的ifstream
打开这个文件,接着就用seekg
,想跳到文件中间的某个位置,然后读取几个字符看看。代码大概长这样:
#include <iostream>
#include <fstream>
int main() {

std::ifstream file("我的文件.txt");
if (*_open()) {
*(5); // 随便跳到第5个字符的位置
char ch;
file >> ch; // 读取一个字符
std::cout << "读取到的字符是:" << ch << std::endl;

} else {
std::cout << "文件打开失败!" << std::endl;
return 0;

跑起来一试,还真读到!
更进一步
然后我又试试第二种用法,这回我想从文件末尾往前跳几个字符:
#include <iostream>
#include <fstream>
int main() {
std::ifstream file("我的文件.txt");
if (*_open()) {
*(-3, std::ios::end); // 从文件末尾往前数3个字符
char ch;
file >> ch;
std::cout << "读取到的字符是:" << ch << std::endl;
} else {
std::cout << "文件打开失败!" << std::endl;
return 0;
这回也成功!看来seekg
用起来也不难嘛
一点小总结
seekg
这个函数就是用来在文件里“定位”的,想从哪儿读就从哪儿读,挺方便的。不过要注意的是,这个函数是给输入文件流(ifstream
)用的,输出文件流(ofstream
)有它自己的“定位”函数,叫seekp
,别搞混。
今天就先折腾到这儿,下次再试试seekp
,看看它俩有啥不一样。