C++文件的随机访问
<上一节
下一节>
在C++中可以由程序控制文件指针的移动,从而实现文件的随机访问,即可读写流中任意一段内容。
一般文本文件很难准确定位,所以随机访问多用于二进制文件。如【例9.9】中对象中两个字符串是按实际串长存放的,不是按数组元素来存放的,而【例9.10】中是按数组长度来存放的,每个对象数据长度固定,所以便于随机访问。
enum seek_dir
{
beg=0, //文件开头
cur=1, //文件指针的当前位置
end=2 //文件结尾
};
istream&istream::seekg(streampos); //指针直接定位
istream&istream::seekg(streamoff, ios::seek_dir); //指针相对定位
long istream::tellg(); //返回当前指针位置
流的指针位置类型streampos和流的指针偏移类型streamoff定义为长整型,也就是可访问文件的最大长度为4G。例:
datafile.seekg(-20L,ios::cur);
//表示将文件定位指针从当前位置向文件头部方向移20个字节。
datafile.seekg(20L,ios::beg);
//表示将文件定位指针从文件头向文件尾方向移20个字节。
datafile.seekg(-20L,ios::end);
//表示将文件定位指针从文件尾向文件头方向移20个字节。
tellg()和seekg()往往配合使用。
//指针不可移到文件头之前或文件尾之后。
ostream&ostream::seekp(streampos);
ostream&ostream::seekp(streamoff,ios::seek_dir);
long ostream::tellp();
为了便于记忆,函数名中g是get的缩写,而p是put的缩写。对输入输出文件定位指针只有一个但函数有两组,这两组函数功能完全一样。
一般文本文件很难准确定位,所以随机访问多用于二进制文件。如【例9.9】中对象中两个字符串是按实际串长存放的,不是按数组元素来存放的,而【例9.10】中是按数组长度来存放的,每个对象数据长度固定,所以便于随机访问。
随机访问指针控制字
在ios类中说明了一个公有枚举类型:enum seek_dir
{
beg=0, //文件开头
cur=1, //文件指针的当前位置
end=2 //文件结尾
};
设置“输入流指针控制字”的成员函数
设置“输入流指针控制字”的成员函数:istream&istream::seekg(streampos); //指针直接定位
istream&istream::seekg(streamoff, ios::seek_dir); //指针相对定位
long istream::tellg(); //返回当前指针位置
流的指针位置类型streampos和流的指针偏移类型streamoff定义为长整型,也就是可访问文件的最大长度为4G。例:
datafile.seekg(-20L,ios::cur);
//表示将文件定位指针从当前位置向文件头部方向移20个字节。
datafile.seekg(20L,ios::beg);
//表示将文件定位指针从文件头向文件尾方向移20个字节。
datafile.seekg(-20L,ios::end);
//表示将文件定位指针从文件尾向文件头方向移20个字节。
tellg()和seekg()往往配合使用。
//指针不可移到文件头之前或文件尾之后。
设置“输出流指针控制字”的成员函数
设置“输出流指针控制字”的成员函数:ostream&ostream::seekp(streampos);
ostream&ostream::seekp(streamoff,ios::seek_dir);
long ostream::tellp();
为了便于记忆,函数名中g是get的缩写,而p是put的缩写。对输入输出文件定位指针只有一个但函数有两组,这两组函数功能完全一样。
举例
【例9.11】使用随机访问对【例9.10】进行改造。(查看源码)
<上一节
下一节>