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

seekg()/seekp()与tellg()/tellp()的用法详解对输入流操作:seekg()与tellg()对输出流操作:seekp()与tellp()下面以输入流函数为例介绍用法:seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:ios::beg:表示输入流的开始位置ios::cur:表示输入流的当前位置io

大家好,又见面了,我是你们的朋友全栈君。


对输入流操作:seekg()与tellg()
对输出流操作:seekp()与tellp()
下面以输入流函数为例介绍用法:
seekg()是对输入文件定位,它有两个参数:第一个参数是偏移量,第二个参数是基地址。
对于第一个参数,可以是正负数值,正的表示向后偏移,负的表示向前偏移。而第二个参数可以是:
ios::beg:表示输入流的开始位置
ios::cur:表示输入流的当前位置
ios::end:表示输入流的结束位置
tellg()函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。

假设文件test。txt为以下内容:
hello,my world
name:hehonghua
date:20090902
程序为:
#include <iostream>
#include <fstream>
#include <assert.h>
using namespace std;
int main()
{

    ifstream in(“test.txt”);
    assert(in);
    in.seekg(0,ios::end);       //基地址为文件结束处,偏移地址为0,于是指针定位在文件结束处
    streampos sp=in.tellg(); //sp为定位指针,因为它在文件结束处,所以也就是文件的大小
    cout<<“filesize:”<<endl<<sp<<endl;

    in.seekg(-sp/3,ios::end); //基地址为文件末,偏移地址为负,于是向前移动sp/3个字节
    streampos sp2=in.tellg();
    cout<<“from file topoint:”<<endl<<sp2<<endl;

   in.seekg(0,ios::beg);        //基地址为文件头,偏移量为0,于是定位在文件头
   cout<<in.rdbuf();            //从头读出文件内容
    in.seekg(sp2);

    cout<<in.rdbuf()<<endl; //从sp2开始读出文件内容

    return 0;
}
则结果输出:
file size:
45
from file to point:
30
hello,my world
name:hehonghua
date:20090902

date:20090902

 

 

四、C++文件流检测EOF

成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是inteof();

例:if(in.eof())ShowMessage(“已经到达文件尾!”);

五、C++文件流文件定位

和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:

1.  istream &seekg(streamoff offset,seek_dir origin);  

2.  ostream &seekp(streamoff offset,seek_dir origin);  

streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:

ios::beg: 文件开头

ios::cur: 文件当前位置

ios::end: 文件结尾

这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

例:

1.  file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节  

2.  file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节 

如果vc编程的话最好使用CFile类等更加方便于文件操作.

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133273.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue子组件向父组件传值的三种方式_vue父页面传值到子页面

    vue子组件向父组件传值的三种方式_vue父页面传值到子页面1.用于子组件触发事件传递给父组件子组件:rowEvent里面也可以带参数事件treeData是携带的参数rowEvent(){this.$emit(‘rowEvent’,’treeData’’);},父组件:在父组件绑定自定义事件直接可以获取到rowEvents(obj){console.log(obj)},2.用ref(常用于不触发的事件)子组件定义个…

    2025年8月31日
    5
  • javaclasscastexception Scala_java unchecked cast object to T

    javaclasscastexception Scala_java unchecked cast object to T在处理JSON时将一个JSONArray强转成List,在线上环境运行正常,但是换了一个环境就出现ClassCastException这个异常。编译时这个强转不会报错,但是运行时却可能出现异常。所以在对对象进行强制转换的时候一定要加以小心,想好实际的对象类型是什么,可不可以强转。

    2025年8月28日
    4
  • modbus协议讲解及实现_通俗易懂近义词

    modbus协议讲解及实现_通俗易懂近义词什么是协议在了解什么是Modbus之前,我们先来看下什么是协议协议是一个汉语词汇,读音为xiéyì,意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IICSPIUART串口通信协议等等。而Modbus也是一个串行通信协议。什么是RS-485RS-2

    2022年10月9日
    2
  • java redis 配置文件_redis配置文件详解(生产环境配置)

    java redis 配置文件_redis配置文件详解(生产环境配置)#当本机为从服务时,设置主服务的连接密码#masterauth#当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:#1)如果slave-serve-stale-data设置为”yes”(默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。#2)如果slave-serve-stale-data设置为…

    2022年6月11日
    69
  • 联想开天 N7 评测

    联想开天 N7 评测开天N7系列笔记本电脑基于兆芯开先KX-6640MA处理器平台,搭配16GB双通道内存和512GBNVMe高速SSD,辅以国产BIOS、OS定制调优;1.29kg超轻单机重量,14.6mm极致纤薄全金属机身;14英寸2.2k16:10显示屏,91%屏占比;支持单手极限180度开盖;率先在国产笔记本引入WiFi6和蓝牙5.0;搭配联想专用芯片的创新智能控制方案,具备光感自动化、开盖即开机、快速充电、充电宝模式等多重独有功能;双风扇双热管散热系统,搭配61Wh

    2022年5月10日
    64
  • Java中遍历Set集合的三种方法「建议收藏」

    Java中遍历Set集合的三种方法「建议收藏」1.迭代遍历:Setset=newHashSet();Iteratorit=set.iterator();while(it.hasNext()){Stringstr=it.next();System.out.println(str);}2.for循环遍历:for(Stringstr:set){System.out.println(str);}…

    2022年6月9日
    130

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号