对于文件的读写方式,C 语言不仅支持简单地顺序读写方式,还支持随机读写(即只要求读写文件中某一指定的部分)。对顺序读写方式来说,随机读写方式需要将文件内部的位置指针移动到需要读写的位置再进行读写,这通常也被称为文件的定位。

对于文件的定位,可以通过 rewind、fseek 与 ftell 函数来完成。

其中,rewind 函数用于将文件内部的位置指针重新指向一个流(数据流或者文件)的起始位置。这里需要注意的是,这里的“指针”表示的不是文件指针,而是文件内部的位置指针。即随着对文件的读写,文件的位置指针(指向当前读写字节)向后移动。而文件指针指向整个文件,如果不重新赋值,文件指针不会发生改变。

rewind 函数的一般原型如下所示:

void rewind(FILE *fp);

从上面的函数原型可以看出,rewind 并没有返回值,因此也无法做安全性检查。如下面的示例代码所示:

FILE *fp=NULL;
fp=fopen("Test.txt","r");
if(fp==NULL)
{
}
rewind(fp);

在上面的示例代码中,由于 rewind 函数没有返回值,所以我们很难判断“rewind(fp)”是否执行成功。因此,应该尽量使用 fseek 来替换 rewind 函数,从而以验证流已经成功地回绕。如下面的示例代码所示:

if (fseek(fp, 0L, SEEK_SET) != 0)
{
}

相对于 rewind 函数而言,fseek 函数的功能更加强大,它用来设定文件的当前读写位置,从而可以实现以任意顺序访问文件的不同位置,以实现文件的随机访问。其函数的一般原型如下所示:

int fseek(FILE *fp,long offset,int from);

如果该函数执行成功,fp 将指向以 from 为基准,偏移 offset 个字节的位置,函数的返回值为 0;如果该函数执行失败(比如 offset 超过文件自身大小),则不改变 fp 指向的位置,函数的返回值为 -1,并设置 errno 的值,可以用 perror 函数来输出错误信息。

对于 fseek 函数中的参数:第一个参数 fp 为文件指针;第二个参数 offset 为偏移量,它表示要移动的字节数,整数表示正向偏移,负数表示负向偏移;第三个参数 from 表示设定从文件的哪里开始偏移,取值范围如表 1 所示。

表 1 from参数取值表

起始点 表符号 数字表示 文件首 SEEK_SET 0 当前位置 SEEK_CUR 1 文件末尾 SEEK_END

2

由表 1 可知:

  • SEEK_SET 表示从文件起始位置增加 offset 个偏移量为新的读写位置;
  • SEEK_CUR 表示从目前的读写位置增加 offset 个偏移量为新的读写位置;
  • SEEK_END 表示将读写位置指向文件尾后,再增加 offset 个偏移量为新的读写位置。

当 from 值为 SEEK_CUR 或 SEEK_END 时,参数 offset 允许出现负值。如下面的示例代码所示:

/*将读写位置移动到离文件开头100字节处*/
fseek(fp,100L,0);
/*将读写位置移动到离文件当前位置100字节处*/
fseek(fp,100L,1);
/*将读写位置退回到离文件结尾100字节处*/
fseek(fp,-100L,2);
/*将读写位置移动到文件的起始位置*/
fseek(fp,0L,SEEK_SET);
/*将读写位置移动到文件尾*/
fseek(fp,0L,SEEK_END);

不难发现,上面的语句“(void)fseek(fp,0L,SEEK_SET);”的作用实际上等同于 rewind 函数。与此同时,在使用 fseek 函数时,还应该注意如下 3 点。

首先,调用 fseek 函数的文件指针 fp 应该指向已经打开的文件,否则将会出现错误。

其次,fseek 函数一般用于二进制文件,当然也可以用于文本文件。需要特别注意的是,当 fseek 函数用于文本文件操作时,一定要注意回车换行的情况。因为在一般浏览工具(如 UltraEdit)中,回车换行被视为两个字符 0x0D 和 0x0A,但真实的文件读写和定位却按照一个字符 0x0A 进行处理。因此,在碰到此类问题时,可以考虑将文件整个读入内存,然后在内存中手工插入 0x0D的方法,这样可以达到较好的处理效果。

最后,fseek 函数只返回执行的结果是否成功,并不返回文件的读写位置。因此,你可以使用 ftell 函数来取得当前文件的读写位置。

ftell 函数的原型为:long ftell(FILE *fp);

该函数用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁前后移动,程序不容易确定文件的当前位置。在使用 fseek 函数后,再调用函数 ftell 就能非常容易地确定文件的当前位置。如下面的示例代码所示:

long getfilelength(FILE *fp)
{long curpos=0L;long length=0L;curpos = ftell(fp);fseek(fp, 0L, SEEK_END);length = ftell(fp);fseek(fp, curpos, SEEK_SET);return length;
}

C语言fseek、ftell和rewind函数详解相关推荐

  1. c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...

  2. 【C语言学习笔记】SWAP函数详解

    SWAP函数详解 本篇文章通过swap函数来深入了解C语言中函数的用法,与指针的应用.参考资料来源于经典书籍与技术博客的分享. 在复习完生存期相关的知识点后(详情可转至此处),初步认识了函数与本地变量 ...

  3. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  4. linux rewind函数,fseek(),ftell()和rewind()函数的用法详解

    转自:http://blog.csdn.net/lijun5635/article/details/14210181 功 能 重定位流( 数据流/文件)上的 文件内部位置 指针 注意:不是 定位文件指 ...

  5. 【fread/fwrite】C语言API之fread/fwrite函数详解

    文章目录 1.函数定义及原型 2.函数功能 3.函数示例 1.函数定义及原型 #include <stdio.h> size_t fread(void *ptr, size_t size, ...

  6. C++语言篇 第九章 自定义函数详解

    序言 一个 C++ 程序无论大小,都由一个或者多个函数组成,而且其中必须有且只有一个函数main(),称之为"主函数". 由函数 main()调用其他函数来完成程序的特定功能.当然 ...

  7. scanf 接收 空格 输入_【C语言】- printf 和scanf 函数详解!

    一.printf函数 这是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据. 1.用法 1> p ...

  8. C语言学习11:strlen()函数详解

    目录 1.strlen()函数功能 2.strlen()函数的使用 2.1 数组 3.注意事项 1.strlen()函数功能 strlen()函数 用于 计算 指定字符串的 长度,但 不包括 结束字符 ...

  9. C语言网络编程:bind函数详解

    文章目录 函数功能 函数头文件 函数使用 函数参数 函数举例 为什么需要bind函数 服务器如何知道客户端的ip和端口号 htons函数 `htons`兄弟函数`htonl`,`ntohs`,`nto ...

最新文章

  1. 重磅 | 最全PPT实录!英伟达发布可编程AI推理加速器TensorRT
  2. javacurrentmap_Java 8 并发: 原子变量和 ConcurrentMap
  3. 金山云html文件,金山云安全开放平台
  4. java添加文字水印插件_java之io添加文字水印
  5. 当面试官问你如何进行性能优化时,你该这么回答(一)
  6. KMP算法的简单理解
  7. 【英语学习】【WOTD】heartstring 释义/词源/示例
  8. ios 添加条纹背景
  9. LINUX SHELL中,如何查找某些文件并删除
  10. linux下安装与部署redis
  11. UI自动化测试实战--- app订单、web发货(9)
  12. php 串口 主板,图解主板插槽:教你选对串口卡
  13. 3.2收缩-扩张喷管实例
  14. web record 前端页面录屏 (react + typescript)
  15. 基于WaterDetect的水域面积提取,以长江中上游水面为例
  16. H5性能测试入门及优化建议
  17. 什么是看门狗(watchdog)?看门狗有什么作用?
  18. iis日志分析 seo必备技能
  19. PHP版田字格带笔顺临摹描红练习字帖在线生成小工具,可直接打印三色的田字格米字格回宫格空格灰格字帖,生成速度快可直接打印或导出成PDF文件等下载地址在最后
  20. 小学数学加减法测试软件,儿童数学练习智能出题系统

热门文章

  1. 在线教育重新被点燃:火花思维逆势融资8500万美元
  2. 2022煤矿井下爆破考试题库模拟考试平台操作
  3. 计算机开机后黑屏 只有鼠标,电脑黑屏只有鼠标箭头怎么办?最简单的解决方法告诉你...
  4. 求一个十六进制数的各二进制位_C语言实现
  5. 使用 youtube api封装播放器的坑
  6. 计算机存储单位 KB,MB,GB,TB,PB
  7. Photoshop 系列:照片调色记录
  8. 卡特加特数字家庭又爆重磅合作!厦门火炬创投莅临卡特加特考察
  9. [解决方案]罗技POWERPLAY鼠标垫无法连接G703/G903/G403等鼠标
  10. 基于jws发布webservice服务