读写文件时,您可能希望直接跳转到文件中的某个位置并开始读写,必须将文件的读写指针指向该位置,然后进行读写。
ifstream和fstream类具有seekg成员函数,可以设置文件的读取指针位置。
ofstream和fstream类具有seekp成员函数,可以设置指向文件的写入指针的位置。
“位置”是指距离文件开头有多少字节。 文件的开头位置为0。
这两个函数的原型如下:
ostreamseekp(intoffset,int模式);
istreamseekg(intoffset,int mode );
mode表示文件读/写指针的设置模式,有三个选项:
ios:beg :将文件的读取指针或写入指针指向从文件开头向后的offset字节。 offset表示文件的开头。 在这种情况下,offset必须为负。
ios:cur :在此情况下,如果offset为负数,则从当前位置向文件开头方向移动offset字节,如果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。 (假设文件太大,无法全部读取到内存中。 步骤如下。
#包含
#包含
#包含
用户命名空间STD;
类事件
{
公共:
char szName[20];
int age;
(;
int main () )
{
CStudent s;
ftreamiofile(students.dat )、ios:in|ios:out ); //读写同时打开
if (! ioFile )
cout 'error ';
返回0;
}
iofile.seekg(0,ios:end; //将读取指针置于文件的末尾,
为了在//后的tellg中获取文件长度
int L=0,r; //L是折回搜索范围内第一条记录的编号
//R是折回搜索范围内最后一条记录的编号
R=ioFile.tellg ()/sizeof ) ) cstudent )- 1;
//第一个搜索范围中最后一条记录的编号为:条记录总数- 1
do {
intmid=(LR )/2; //将搜索范围中间的记录与要搜索的名称进行匹配
io file.seekg (mid * sizeof (cstudent )、ios:beg ); //定位于中间的记录
iofile.read((char* ) s,sizeof(s ) );
inttmp=strcmp(s.szname,' Jack ';
已找到if(tmp==0)//
s.age=20;
io file.seekp (mid * sizeof (cstudent )、ios:beg );
iofile.write((char* ) s,sizeof(s ) );
布雷克;
}
ELSEif(tmp0)//继续搜索到前一半
R=mid - 1;
持续寻找到else //后半部分
L=mid 1;
}while(L=R );
ioFile.close (;
返回0;
}