fseek()函数可以像对待一个数组一样对待一个文件,fopen()打开的文件中,fseek()可以直接移动到任意字节的位置。

如果按反序显示一个文件,,且使用命令行参数获得要读取的文件的名字。(注:fseek()接受3个参数,返回一个int值),ftell()以一个long类型值返回一个文件的当前位置。

/*reverse.c   按反序显示一个文件*/
#include <stdio.h>
#include <stdlib.h>
#define CNTL_Z '\032'                         /*DOS文本文件中的文件结尾标记*/
#define SLEN 50
int main (void)
{char file[SLEN];char ch;FILE *fp;long count,last;puts("Enter tne name of the file to be processed:");gets(file);if ((fp=fopen(file,"rb"))==NULL){            /*只读和二进制模式,适用于二进制模式,但不一定适用于文本模式*/printf("resever can't open %s\n",file);exit(1);}fseek(fp,0L,SEEK_END);                        /*定位到文件结尾处*/last=ftell(fp);                               /*把从文件开始到文件结束的字节数目赋给last*/for(count=1L;count<=last;count++){fseek(fp,-count,SEEK_END);                /*回退,第一次循环将程序定位到文件结尾前的第一个字符,就是文件的最后一个字符,依次往前,一直到文件的第一个字符*/ch=getc(fp);                            /*针对DOS,UNIX下也可以工作*/if(ch!=CNTL_Z && ch != '\r')              /*防止程序打印“Ctrl+Z”字符*/putchar(ch);/*针对Macintosh*//*if(ch == '\r')putchar('\n');elseputchar(ch);        */}putchar('\n');fclose(fp);return 0;
}

fseek()的工作方式

int fseek ( FILE * stream, long int offset, int origin );

在fseek()的三个参数中,第一个参数是一个已经被fopen()打开的文件(即搜索文件)的FILE指针;第二个参数是偏移量(即从起始点开始要移动的距离),这个参数必须是long类型的值,前移为正,后移为负,不懂为0;第三个参数是模式,标识起点。在ANSI下,stdio.h头文件指定了下列模式常量:

模式 偏移量的起始点
SEEK_SET 文件开始
SEEK_CUR 当前位置
SEEK_END 文件结尾

以前的定义分别用0L、1L、2L表示这些模式,L是long类型值。也可以其他头文件中定义模式常量。

比如,fp作为一个文件指针,

fseek(fp,0L,SEEK_SET);       //找到文件的开始处
fseek(fp,10L,SEEK_SET);      //找到文件的第10个字节
fseek(fp,2L,SEEK_CUR);       //从文件的当前位置向前移动2个字节
fseek(fp,0L,SEEK_END);       //到达文件的结尾处
fseek(fp,-10L,SEEK_END);     //从文件结尾处退回10个字节

如果正常,fseek()返回0;如果有错误,比如试图移动超过文件范围,fseek()返回-1.

ftell()函数为long类型,返回文件的当前位置。在ANSI下,ftell()函数在stdio.h头文件的中被声明.ftell()函数通过返回距离文件开始处的字节数来确定文件的位置,比如文件的第一个字节到文件的开始处的距离就是0,适用于二进制模式,但不一定适用于文本模式

1.二进制模式和文本模式

UNIX只有一种文件格式,上述程序可以无需改动(UNIX文件中通常不包含Ctrl+Z和\r)。而MS-DOS值得关注,许多MS-DOS编辑器使用Ctrl+Z标识文本文件的结尾,如果以文本文件的形式打开,并无大碍;如果以二进制模式打开,Ctrl+Z会被看做字符。而真正的文件在后面,除非紧跟着Ctrl+Z,否则是用空字符填满到256(或其他数)的倍数。DOS下不打印空字符。

2.MS-DOS用\r\n组合表示文本文件的换行符,以文本模式打开文件的C程序将\r\n看做\n。二进制模式中要向上述程序中处理\r。

由于ftell()在文本模式和二进制模式下的工作方式有所不同,ANSI C规定,对于文本模式,ftell()返回一个可以用作fseek()的第二个参数的值。例如,MS-DOS中,ftell()返回一个将\r\n看做一个字符的计数值。

在文本模式中,确保有效的fseek()调用只有以下这些

fseek(file,0L,SEEK_SET) 到文件开始
fseek(file,0L,SEEK_CUR) 在当前位置不动
fseek(file,0L,SEEK_END) 到文件结尾
fseek(file,ftell-pos,SEEK_SET) 到距文件开始处ftell-pos字节的位置,ftel-pos是ftell的返回值

有一点,fseek()和ftell()两个函数是相对于long类型而言,对于更大的数值,ANIS C引入了两个用来处理较大文件的新的定位函数,类型为fpos_t(file position type,文件定位类型)

1.fgetpos()函数原型:int fgetpos(FILE *restrict stream,fpos_t *restrict pos),调用成功返回0,否则非零

2.fsetpos()函数原型:int fsetpos(FILE *stream,const fpos_t *pos),调用成功返回0,否则非零,此处fpos_t的值是通过调用fgetpos()获取的。

cpp整理学习笔记 文件I/O:随机存取fseek()和ftell()相关推荐

  1. Linux学习笔记-文件权限与路径

    Linux学习笔记-文件与目录 目前从电子信息科学与技术转到了计算机专业,因此想趁着大四比较闲的时候补一些计算机的知识.我想说:你好,生活[斜眼笑]!愿生活温柔以待!哈哈,这是我写的第一篇博客,谨以此 ...

  2. Linux学习笔记 文件服务Vsftp详细介绍

    Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...

  3. PHP学习笔记-文件操作1

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52294237 本文出自:[顾林海的博客] 前言 PHP支持文件上传功能 ...

  4. node.js学习笔记 - 文件上传(并用七牛云托管)

    文章目录 环境搭建 准备工作 安装相关依赖 代码实现 执行 环境搭建 准备工作 提示:本文采用ts来构建环境,要是以js构建则取掉类型定义即可. 初始化项目 创建目录fileUpload-demo- ...

  5. 关于单片机内存解释的整理(学习笔记篇)

    成就更好的自己 学习笔记篇 本文为转载,原文为CSDN博主dtj-ee 原文链接:https://blog.csdn.net/sinat_30146065/article/details/822211 ...

  6. Linux基本命令学习笔记--文件查看、下载、查找

    1.Linux基本命令学习笔记–(文件查看) cat -整个查看 -n:行号 >(创建.覆盖) >>(追加)a.txt<<EOF:编写内容 内容 EOF (定格写:结束) ...

  7. c学习笔记 文件输入/ 输出 20210314

    与文件进行通信 文本模式和二进制模式 c提供两种访问文件的途径:二进制模式和文本模式.二进制模式下可访问文件的每个字节. MS-DOS模式下, 用\r\n表示新的一行, Ctrl+z表示文件的结束. ...

  8. Matlab学习笔记——文件的打开与关闭

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 文件的打开与关闭 1.fopen函数 2.fclose函数 文件的打开与关闭 1.fopen函数 用于打开文件,其 ...

  9. 嵌入式Linux基础学习笔记-文件IO编程-文件锁(1)

    文件锁-文件共享 共享资源竞争问题的解决方法:文件锁. 文件锁包括 建议性锁 要求每个上锁文件的进程都要检查是否有锁存在,并且尊重 已有的锁 强制性锁 由内核执行的锁,当一个文件被上锁进行写入操作的时 ...

最新文章

  1. GFS 分布式文件系统从入门到实践
  2. javascript(js)获取访客通过搜索引擎进入页面的搜索关键词的简洁有效代码
  3. 我为啥不想用Python
  4. Sublime Text 3 Plugin Better!
  5. mongodb聚合内存不足解决方案
  6. 在线教育平台HTML代码,在线教育学习管理平台html前端源码模板
  7. linux内核实时补丁的实现,Canonical释出用于Ubuntu 18.04 LTS和16.04 LTS的新Linux内核实时补丁...
  8. 全国省市区(县)级地名xml(一)
  9. linux的4k播放器,【Linux1GB4K(3840*2160)电视播放器】Linux1GB4K(3840*2160)电视播放器报价及图片大全-列表版-ZOL中关村在线...
  10. 靠微信小程序两周获客20万,同城小程序开始爆发
  11. 骨传导耳机的利与弊有哪些?骨传导耳机到底好不好?
  12. Android通知Notification使用全解析,看这篇就够了
  13. 加餐0 | 前后端快速入门学习路线
  14. php 判断app浏览器打开,手机浏览器下判断是否安装某app,并判断是否打开该应用...
  15. python数字精度自动变化_如何在python中将一个数字转换成12位精度?
  16. matlab dmc仿真实例
  17. vectorvn1610报价_VECTOR VN1610 CAN Network 通讯模块
  18. luoguP2495 [SDOI2011]消耗战
  19. GitBook制作电子书详细教程(命令行版)
  20. Unresolved Dependencies

热门文章

  1. [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  2. vue3中的tsx写法
  3. 用 Uno Platform 构建一个 Kanban-style Todo App
  4. js实现键盘数字输入
  5. DeepRacer线下比赛总结 2022 地图 Re Invent 2018
  6. 一周速递|全球车联网产业动态(2022年10月16日)
  7. C语言--第二篇类型、运算符与表达式
  8. Word插入题注快捷键
  9. 小米手机10 青春版(Mi 10 Lite Zoom)TWRP刷入12.5版教程
  10. eap wifi 证书_WIFI用户EAP-TLS认证.pdf