相关文章推荐
威武的鸡蛋面  ·  mysql ...·  7 月前    · 
聪明伶俐的煎鸡蛋  ·  Spring ...·  1 年前    · 
输入输出流
11 文件操作
11.1 文件到底是什么?
11.2 C++文件类(文件流类)及用法详解
11.3 C++文件的打开
11.4 文本打开方式和二进制打开方式的区别是什么?
11.5 C++ close()关闭文件方法详解
11.6 C++打开的文件一定要用close()方法关闭!
11.7 C++文本文件读写操作详解
11.8 C++ read()和write()读写二进制文件
11.9 C++ get()和put()读写文件详解
11.10 C++ getline():从文件中读取一行字符串
11.11 C++移动或获取文件读写指针
C++多文件编程 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> u sin g 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 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;

关注公众号「 站长严长生 」,在手机上阅读所有教程,随时随地都能学习。内含一款搜索神器,免费下载全网书籍和视频。

微信扫码关注公众号