C++移动和获取文件读写指针(seekp、seekg、tellg、tellp)
在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。
ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置;
ofstream 类和 fstream 类有 seekp 成员函数,可以设置文件写指针的位置。
所谓“位置”,就是指距离文件开头有多少个字节。文件开头的位置是 0。
这两个函数的原型如下:
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 或者负数。
此外,我们还可以得到当前读写指针的具置:
ifstream 类和 fstream 类还有 tellg 成员函数,能够返回文件读指针的位置;
ofstream 类和 fstream 类还有 tellp 成员函数,能够返回文件写指针的位置。
这两个成员函数的原型如下:
int tellg();
int tellp();
要获取文件长度,可以用 seekg 函数将文件读指针定位到文件尾部,再用 tellg 函数获取文件读指针的位置,此位置即为文件长度。例题:假设学生记录文件 students.dat 是按照姓名排好序的,编写程序,在 students.dat 文件中用折半查找的方法找到姓名为 Jack 的学生记录,并将其年龄改为 20(假设文件很大,无法全部读入内存)。程序如下:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
class CStudent
{
public:
char szName[20];
int age;
};
int main()
{
CStudent s;
fstream ioFile("students.dat", ios::in|ios::out);//用既读又写的方式打开
if(!ioFile) {
cout << "error" ;
return 0;
}
ioFile.seekg(0,ios::end); //定位读指针到文件尾部,
//以便用以后tellg 获取文件长度
int L = 0,R; // L是折半查找范围内个记录的序号
// R是折半查找范围内一个记录的序号
R = ioFile.tellg() / sizeof(CStudent) - 1;
//查找范围的一个记录的序号就是: 记录总数- 1
do {
int mid = (L + R)/2; //要用查找范围正中的记录和待查找的名字比对
ioFile.seekg(mid *sizeof(CStudent),ios::beg); //定位到正中的记录
ioFile.read((char *)&s, sizeof(s));
int tmp = strcmp( s.szName,"Jack");
if(tmp == 0) { //找到了
s.age = 20;
ioFile.seekp(mid*sizeof(CStudent),ios::beg);
ioFile.write((char*)&s, sizeof(s));
break;
}
else if (tmp > 0) //继续到前一半查找
R = mid - 1 ;
else //继续到后一半查找
L = mid + 1;
}while(L <= R);
ioFile.close();
return 0;
}
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 儿童教育文章(儿童教育)
- 光遇花手先祖位置(安卓光遇手花先祖)
- 广州4a广告公司(广州4a广告公司创意总监年薪)
- 抖音卡(抖音卡顿怎么解决)
- xboxones(xboxone手柄怎么配对主机)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 帆船比赛(帆船比赛视频)
- 海猫鸣泣之时游戏(海猫鸣泣之时游戏在哪玩)
- 韩国媳妇和小雪(韩国媳妇和小雪的父亲工资是多少)
- 儋州市第二中学(儋州市第二中学录取分数线)
- 地球日主题(2020年世界地球日主题)
- 和柳亚子(和柳亚子先生于田)
- 冰客(冰客果汁)
- yy魔兽(yy魔兽世界)
- 充值卡代理(充值卡代理加盟)
- 拆奶罩
- 东天目山(东天目山景区)
- 杭同(杭同培训中心怎么样)
- 蝙蝠给人类的一封信(蝙蝠给人类的一封信)
- 大松电饭煲(美的大松电饭煲)
- 服饰加盟(服饰加盟店招商)
- 疯狂填字(疯狂填字5)
- 点对点短信息(点对点短信息费是什么意思)
- 观音普门品(观音普门品念诵全文)
- 河北省大运会(河北省大运会时间)
- 哈利波特官网(哈利波特官网在哪里)
- 查传倜(查传倜个人生活)
- 广州晓港公园(广州晓港公园正门图片)
