php网站建设模板,佛山公司网站设计团队,安徽省住房和城乡建设厅门户网站,怎么制作html文档在读写文件时#xff0c;有时希望直接跳到文件中的某处开始读写#xff0c;这就需要先将文件的读写指针指向该处#xff0c;然后再进行读写。 ifstream 类和 fstream 类有 seekg 成员函数#xff0c;可以设置文件读指针的位置#xff1b;ofstream 类和 fstream 类有 seekp…在读写文件时有时希望直接跳到文件中的某处开始读写这就需要先将文件的读写指针指向该处然后再进行读写。 ifstream 类和 fstream 类有 seekg 成员函数可以设置文件读指针的位置ofstream 类和 fstream 类有 seekp 成员函数可以设置文件写指针的位置。所谓“位置”就是指距离文件开头有多少个字节。文件开头的位置是 0。
这两个函数的原型如下
ostream seekp (int offset, int mode);
istream seekg (int offset, int mode);mode 代表文件读写指针的设置模式有以下三种选项 1 . ios::beg让文件读指针或写指针指向从文件开始向后的 offset 字节处。offset 等于 0 即代表文件开头。在此情况下offset 只能是非负数。
2 . ios::cur在此情况下offset 为负数则表示将读指针或写指针从当前位置朝文件开头方向移动 offset 字节为正数则表示将读指针或写指针从当前位置朝文件尾部移动 offset字节为 0 则不移动。
3 . 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;//首次查找范围的最后一个记录的序号就是: 记录总数- 1do {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;
}