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;//首次查找范围的最后一个记录的序号就是: 记录总数- 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;
}

C++移动和获取文件读写指针(seekp、seekg、tellg、tellp)相关推荐

  1. C++ 移动和获取文件读写指针

    在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写. ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置: ...

  2. Visual Studio 2013开发 mini-filter driver step by step 获取文件读写内容(6)

    由于后面的内容跟Visual Studio已经没有太大关系,故文章标题去掉Visual Studio前缀. 今天刚好在CSDN上读到一篇文章<程序员都要有八块腹肌>,所以要练好身体啊!其实 ...

  3. python获取文件读写权限_Python 查看文件的读写权限方法

    实例如下: # -*- coding: utf-8 -*- # @author flynetcn import sys, os, pwd, stat, datetime; LOG_FILE = '/v ...

  4. seekg()/seekp()与tellg()/tellp()的用法详解

    转自mafuli007的博客 对输入流操作:seekg()与tellg() 对输出流操作:seekp()与tellp() 下面以输入流函数为例介绍用法: seekg()是对输入文件定位,它有两个参数: ...

  5. C++ fstream类移动读写指针和字节数形式获取该指针位置(seekp、seekg、tellg、tellp)

    参考链接 C++移动和获取文件读写指针(seekp.seekg.tellg.tellp) 1.利用seekp.seekg成员函数控制读写指针位置 在读写文件时,有时希望直接跳到文件中的某处开始读写,这 ...

  6. (P60)io流类库:文件读写,二进制文件的读写,文件随机读写tellp、tellg、seekp、seekg

    文章目录 1.文件读写 2.二进制文件的读写 3.文件随机读写tellp.tellg.seekp.seekg 1.文件读写 文本读写方式1:<<, >>, 文本读写方式2:ge ...

  7. c语言fgetpos的参数,C语言fgetpos()函数:获得当前文件的读写指针(转)

    头文件:#include fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos()和fsetpos()使用.f ...

  8. 文件读写和文件指针的移动

    read 函数 -#include <unistd.h>-ssize_t read(int fd, void *buf, size_t count); 从fd 所指的文件中读取count ...

  9. C语言fgetpos()函数:获得当前文件的读写指针(转)

    头文件:#include<stdio.h> fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos( ...

最新文章

  1. JFinal 源码导读第八天(1) Db.tx 事物
  2. Winform开发框架之肖像显示保存控件的实现
  3. 深入Java调试体系之JDWP协议及实现
  4. 导出到Excel的操作
  5. java7和java8切换_仍不切换到Java 8的6个理由
  6. oracle审计实施
  7. java中的step_Java中finalize()
  8. 用GO语言开发editplus编辑器插件(附源码)
  9. 【图像几何】基于matlab GUI插值图像运算【含Matlab源码 850期】
  10. maria安装包mysql_Redhat 7.3安装系统自带Mariadb安装包
  11. 服务器硬盘检测工具有哪些,最常用的10大服务器管理工具
  12. Java编程练习:100以内的质数的输出
  13. java 单体测试_单体测试指南
  14. 《玩透嵌入式C的角角落落》当你需要循环体至少执行一次时,选择do
  15. 【Xmy的第一次Python】
  16. 自动白平衡技术(AWB)
  17. 中国石油大学华东2013-2014-1c语言a卷_答案,中国石油大学(华东)2012—2013学年第二学期期中A卷试卷答案...
  18. notify()和notifyAll()有什么区别?
  19. 中国工程院院士高文:从大数据科学到人工智能的迁移过程
  20. 考研英语近义词与反义词·十一

热门文章

  1. 安卓 呼吸灯效果--代码实现
  2. android git gif,GitHub - lchad/Gifflen-Android: Android上合成gif图片.
  3. 图书-管理:《80/20定律》
  4. 医疗器械检查常见问题解答
  5. 支付宝仍然一意孤行做社交,阿里已别无他路
  6. kdtree最简单易懂的介绍
  7. 在 openEuler 上通过 KubeEdge+iSulad 搭建云边协同集群
  8. 使用麦克风和Arduino测量噪音水平(以dB为单位)
  9. 阿里集团CTO王坚:云计算是一种公共服务
  10. 【前端精进之路】JS篇:第4期 作用域