C语言中文件定位函数总结

C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos。

先来讲前两个函数,这是最基本的定位函数:


 

  fseek函数:能把文件指针移动到文件任何位置,其原型是:int fseek(FILE *fp, long offset, int fromwhere);

  参数解释:第一个参数为要进行定位的文件的指针;第二个参数为定位的偏移量,一个有符号的long类型值,正数表示文件指针向后偏移,负数表示文件指针向前偏移,0 表示不进行偏移;第三个参数表示文件指针从哪个位置开始偏移,有三个值可选,SEEK_SET & SEEK_CUR & SEEK_END,分别表示文件第一个字节(即第零个位置),文件指针当前所指字节(即当前位置)和文件EOF位置。

  返回值:返回 0 表示操作成功,返回非 0 表示操作失败。

  其他注意:该函数不能定位到第一个字节之前的位置,如果尝试这样操作会导致fseek返回 -1,即操作失败,比如这样的代码“j = fseek(fp, -4L, SEEK_SET );”,其中 j 值就是 -1;但是,该函数能定位到EOF位置之后的位置,并且不报错,即使这样是没有意义的,比如这样的代码“j = fseek(fp, 4L, SEEK_END)”,返回值 j 是 0,并且此时 ftell(fp) 返回值是SEEK_END + 4。


 

  ftell函数:能返回当前文件指针所在的位置(文件的第一个字节所在位置是零),其原型是:long ftell(FILE *fp);

  参数解释:有且仅有一个参数,为一个文件的指针。

  返回值:有符号long类型的正向值,即0~2147483647。

  其他注意:暂无。


 

实际上,前两个函数对文件指针的定位虽然都很方便,但是它们都有一个局限性,那就是它们能定位的最大字节是依据 long 类型的取值范围决定。比如 fseek(fp, max_pos, SEEK_SET);,它能移动的最大偏移量是 max_pos = 2147483647字节,即1GB,对于大于1GB的文件来说就力不从心了。

所以ANSI C推出了解决大文件定位的方案,即后两个函数!(不过,即使是现在,直接处理一个超过1G的单文件还是比较少的)

在说这两个函数之前,先要介绍一个数据类型fpos_t,它是一个结构体类型,保存着文件指针的位置,并且这种数据类型只能被fgetpos和fsetpos函数使用。


  fsetpos函数:将文件指针的位置设置为fpos_t类型变量所保存的位置,其原型是:int fsetpos(FILE *, const fpos_t *)

  参数解释:第一个参数为一个文件的指针;第二个参数为一个fpos_t类型的指针。

  返回值:0 表示操作成功,非 0 表示操作失败。

  其他注意:暂无。


  fgetpos函数:将文件指针的位置保存到fpos_t类型变量中,其原型是:int fgetpos(FILE *, fpos_t *)

  参数解释:同fsetpos。

  返回值:同fsetpos。

  其他注意:暂无。


总结:后两个函数通常是fseek函数偏移累加之后超过long范围时才用到,例如如下代码:

fpos_t pos;
//定义一个fpos_t类型的变量pos
f = fopen("a.txt", "r");
//假设a.txt是一个超过1G的文件
fseek(f, 2000000000L, SEEK_SET);
//向后偏移20亿字节
fseek(f, 1000000000L, SEEK_CUR);
//再向后面偏移10亿字节
//此时,文件指针的位置已经超过了signed long的正向范围,就需要用fpos_t类型变量来保存文件指针位置了
fgetpos(f, &pos);
//此时,当前文件指针的位置已保存到pos变量中了
fseek(f, 5000L, SEEK_CUR);
printf("%x\n", getc(f));
//再向后偏移5千字节,并取出偏移后所在的字节,以十六进制打印出来
fsetpos(f, &pos);
//利用fsetpos函数重置文件指针,根据最后一次fgetpos保存的pos值,这次函数操作将向前偏移5千字节
printf("%x\n", getc(f));
//以十六进制打印出当前字节
fclose(f);
//释放文件流

 上述代码可能有点抽象,因为你可能一时间找不到大于1G的文件,那么我们就用小文件来演示一下:

假设文件"utf8.txt"的十六进制结构如下:

41 42 43 56 57 44 44 4B

C语言代码如下:

FILE * f1;
fpos_t pos;
f1 = fopen("utf8.txt", "r");
fseek(f1,2,SEEK_SET);
fgetpos(f1, &pos);
fseek(f1,4,SEEK_SET);
printf("%x\n", getc(f1));
fsetpos(f1,&pos);
printf("%x\n", getc(f1));
fclose(f1);

输出结果:

57
43
Press any key to continue

转载于:https://www.cnblogs.com/ryzz/p/9357158.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

API

api 百科名片 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。目…

Matlab gatool使用方法

可以通过输入gatool或者optimtool(ga)打开图形界面或者用ga()运行命令行函数设置Fitnessfunction 和对应的Number of variables,为了提高效率最好向量化适应度函数,然后设置Vectorize参数为On可以选择相应参数进行设置Population种群参数Fitness scalling适应度比例参数Selecti…

系统模块 OS

os.system("系统命令") 调用系统命令 os.system("task kill /f /im 系统的进程") 关闭系统进程 os.listdir(地址) 扫描目录里面的文件。默认的是当前文件夹 返回一个列表 import os # os.listdir(地址) 扫描目录里面的文件。默认的是当前文件夹 print(os.…

Matlab非线性拟合工具箱cftool

一、 单一变量的曲线逼近 Matlab有一个功能强大的曲线拟合工具箱 cftool ,使用方便,能实现多种类型的线性、非线性曲线拟合。下面结合我使用的 Matlab R2007b 来简单介绍如何使用这个工具箱。 假设我们要拟合的函数形式是 yA*x*x B*x, 且A>0,B>0…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

C#中数据库事务、存储过程基本用法

SQL 事务 public bool UpdateQsRegisterSql(List<string> ids, int newQueueId, string newQueueName){using (SqlConnection con new SqlConnection(DBHelper.Instance.ConStr)){SqlTransaction tran null;try{con.Open();SqlCommand cmd con.CreateCommand();tran …

第一章 初识Mathematica

第一章 初识Mathematica 1&#xff0e;Mathematica是什么 Matematica是由美国Wolfram公司研究开发的一个著名的数学软件&#xff0c;它提供了非常强大的功能&#xff0c;能够完成符号运算、数学图形的绘制、甚至动画制作等多种操作。Matematica的基本系统主要是用C语言开发的&…

matlab中统计工具箱函数名大全

MATLAB统计工具箱包括概率分布、方差分析、假设检验、分布检验、非参数检验、回归分析、判别分析、主成分分析、因子分析、系统聚类分析、K均值聚类分析、试验设计、决策树、多元方差分析、统计过程控制和统计图形绘制等。优化工具箱包括无约束最优化、有约束最优化、二次规划、…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…

使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 我们刚刚发布了Java SDK的主要升级版…

Matlab optimtool优化(Optimization)工具箱

1 工具箱概述1.1 功能&#xff08;1&#xff09;求解无约束条件非线性极小值&#xff1b;&#xff08;2&#xff09;求解约束条件下非线性极小值&#xff0c;包括目标逼近问题、极大-极小值问题和半无限极小值问题&#xff1b;&#xff08;3&#xff09;求解二次规划和线性规划…

Python目录链接

第1章  就这么愉快的开始吧 课时1&#xff1a;我和python的第一次亲密接触 一、Python3的下载与安装 二、从IDIE启动Python 三、尝试点新的东西 四、为什么会这样&#xff1f; 五、课时01课后习题及答案 第2章  用Python设计一个游戏 课时2&#xff1a;用python设计第一个…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

VS高版本编写C程序的C4996错误

最简单的可以用的方法:选项Project | Configuration Properties | C/C | Preprocessor | Preprocessor Definitions 添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…

Windows、Linux和MAC的CR, LF, CR/LF换行符

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符. Dos和windows&#xff1a; 采用回车换行CR/LF表示下一行. UNIX/Linux &#xff1a; 采用换行符LF表示下一行. MAC OS &#xff1a; 采用回车符CR表示下一行. CR用符号\r表示, 十进制ASCII代码是13, 十六进制代…

GitHub多人协作简明教程

本文面向已经了解/熟悉git基本命令但是并不熟悉如何使用GitHub进行多人协作开发项目的同学。 为了简单起见&#xff0c;这里假设只有两个开发人员&#xff0c;HuanianLi 和 DaxiangLi。他们在GitHub上的地址和角色为&#xff1a; HuanianLi: https://github.com/huanianli # M…

Matlab 图像处理

实验一 Matlab语言、数字图象基本操作 一、实验目的 1、复习MATLAB语言的基本用法&#xff1b; 2、掌握MATLAB语言中图象数据与信息的读取方法&#xff1b; 3、掌握在MATLAB中绘制灰度直方图的方法&#xff0c;了解灰度直方图的均衡化的方法。 二、实验原理 MATLAB是集数值…

JGroups:无需额外基础架构的领导人选举

嗨&#xff0c;您好&#xff0c; 在这篇文章中&#xff0c;我将展示如何在不使用任何其他基础架构&#xff08;例如Apache Zookeeper或Consul&#xff09;的情况下解决领导人选举的问题。 领导者选举是解决以下问题的一种常见方法&#xff1a;在分布式系统中&#xff0c;只有…

8086寄存器

SI源变址寄存器DI目地变址寄存器1:数据寄存器,一般称之为通用寄存器组AH&AL&#xff1d;AX&#xff1a;累加寄存器&#xff0c;常用于运算&#xff1b; BH&BL&#xff1d;BX&#xff1a;基址寄存器&#xff0c;常用于地址索引&#xff1b; CH&CL&#xff1d;CX&…