C++ 移动和获取文件读写指针
在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。
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;
}
C++ 移动和获取文件读写指针相关推荐
- C++移动和获取文件读写指针(seekp、seekg、tellg、tellp)
C++移动和获取文件读写指针(seekp.seekg.tellg.tellp) 在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写. ifstrea ...
- Visual Studio 2013开发 mini-filter driver step by step 获取文件读写内容(6)
由于后面的内容跟Visual Studio已经没有太大关系,故文章标题去掉Visual Studio前缀. 今天刚好在CSDN上读到一篇文章<程序员都要有八块腹肌>,所以要练好身体啊!其实 ...
- python获取文件读写权限_Python 查看文件的读写权限方法
实例如下: # -*- coding: utf-8 -*- # @author flynetcn import sys, os, pwd, stat, datetime; LOG_FILE = '/v ...
- C++ fstream类移动读写指针和字节数形式获取该指针位置(seekp、seekg、tellg、tellp)
参考链接 C++移动和获取文件读写指针(seekp.seekg.tellg.tellp) 1.利用seekp.seekg成员函数控制读写指针位置 在读写文件时,有时希望直接跳到文件中的某处开始读写,这 ...
- c语言fgetpos的参数,C语言fgetpos()函数:获得当前文件的读写指针(转)
头文件:#include fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos()和fsetpos()使用.f ...
- 文件读写和文件指针的移动
read 函数 -#include <unistd.h>-ssize_t read(int fd, void *buf, size_t count); 从fd 所指的文件中读取count ...
- C语言fgetpos()函数:获得当前文件的读写指针(转)
头文件:#include<stdio.h> fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中.pos以内部格式存储,仅由fgetpos( ...
- c++ 文件读写(转)
C/C++ code //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> ...
- 在 iOS 中对接收到的网络数据(NSData)进行文件读写
在 c 语言中,文件操作都是由库函数来实现的,主要是分为读和写两种操作: 文件指针 平常所说的文件不同于其他常见的数据类型,比如一个test.txt文档,它有自己的一些属性,比如文件的当前位置.与该文 ...
最新文章
- linux驱动:音频驱动(三)ASoc之machine驱动及card初始化
- angularJs 前端的页面分解与组装
- 根据作用C语言关键字分为,C语言 关键字
- 前端学习(1661):前端系列实战课程之获取点击位置
- win10 使用ssh连接服务器 ‘’Bad owner or permissions on C:\\Users\\Administrator/.ssh/config‘’
- VC realize the transparent windows
- Func和Action的介绍及其用法
- flutter绘图基础之三阶贝塞尔曲线cubicTo
- python搭建web服务器需要tomcat吗_如何快速学习网站基本搭建和服务器环境配置(LAMP/LNMP/Tomcat)?...
- electron 改变窗体 大小_「Science子刊」约翰·霍普金斯大学创造灰尘大小设备,可协助药物在胃肠道停留24小时之久...
- 面试题 17.09. 第 k 个数
- webpack 代理问题
- 口布杯花的60种叠法_10种餐巾折花杯花的步骤用文字解说怎么折
- 职场泥潭,这样的IT公司绝对不宜久留
- 怎样用计算机做ppt,电脑怎么制作ppt步骤
- linux驱动之输入子系统
- 学中医的女生写出的保养大法
- 使用AWK和XARGS为文件批量改名
- 学习C++:C++进阶(三)CMake基础篇---用一个小型项目了解CMake及环境构建
- SpringCloud知识点总结
热门文章
- 惠普10代的服务器有哪些型号,英特尔官方科普:秒懂十代酷睿型号怎么认!
- pat根据中序遍历和先序遍历_[leetcode/lintcode 题解] 前序遍历和中序遍历树构造二叉树...
- 计算机知识竞赛决赛流程,计算机知识竞赛决赛圆满结束!还不快戳?!
- websocket学习总结记录
- .某学校的学生公寓有14栋楼,用A~N这14个大写字母的其中一个代表楼号,每栋楼的层数为6层,用1~6六个数字表示。每层楼有40个房间,编号为01~40。具体表示一个宿舍房间时,用1个字母加3位数字表
- php.amazeui,AmazeUI 导航条的实现示例
- python内置函数详解总结篇_Python内置函数详解——总结篇
- 云服务器如何链接本地打印机_利用FileZilla搭建云服务器FTP服务端和本地客户端...
- java中的列表栈链表_Java数据结构(栈,队列,双链表)
- wapper打成linux服务,Wrapper配置详解及高级应用(转)