cpp整理学习笔记 文件I/O:随机存取fseek()和ftell()
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()相关推荐
- Linux学习笔记-文件权限与路径
Linux学习笔记-文件与目录 目前从电子信息科学与技术转到了计算机专业,因此想趁着大四比较闲的时候补一些计算机的知识.我想说:你好,生活[斜眼笑]!愿生活温柔以待!哈哈,这是我写的第一篇博客,谨以此 ...
- Linux学习笔记 文件服务Vsftp详细介绍
Linux学习笔记 文件服务Vsftp详细介绍 知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据 ...
- PHP学习笔记-文件操作1
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/52294237 本文出自:[顾林海的博客] 前言 PHP支持文件上传功能 ...
- node.js学习笔记 - 文件上传(并用七牛云托管)
文章目录 环境搭建 准备工作 安装相关依赖 代码实现 执行 环境搭建 准备工作 提示:本文采用ts来构建环境,要是以js构建则取掉类型定义即可. 初始化项目 创建目录fileUpload-demo- ...
- 关于单片机内存解释的整理(学习笔记篇)
成就更好的自己 学习笔记篇 本文为转载,原文为CSDN博主dtj-ee 原文链接:https://blog.csdn.net/sinat_30146065/article/details/822211 ...
- Linux基本命令学习笔记--文件查看、下载、查找
1.Linux基本命令学习笔记–(文件查看) cat -整个查看 -n:行号 >(创建.覆盖) >>(追加)a.txt<<EOF:编写内容 内容 EOF (定格写:结束) ...
- c学习笔记 文件输入/ 输出 20210314
与文件进行通信 文本模式和二进制模式 c提供两种访问文件的途径:二进制模式和文本模式.二进制模式下可访问文件的每个字节. MS-DOS模式下, 用\r\n表示新的一行, Ctrl+z表示文件的结束. ...
- Matlab学习笔记——文件的打开与关闭
写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 文件的打开与关闭 1.fopen函数 2.fclose函数 文件的打开与关闭 1.fopen函数 用于打开文件,其 ...
- 嵌入式Linux基础学习笔记-文件IO编程-文件锁(1)
文件锁-文件共享 共享资源竞争问题的解决方法:文件锁. 文件锁包括 建议性锁 要求每个上锁文件的进程都要检查是否有锁存在,并且尊重 已有的锁 强制性锁 由内核执行的锁,当一个文件被上锁进行写入操作的时 ...
最新文章
- GFS 分布式文件系统从入门到实践
- javascript(js)获取访客通过搜索引擎进入页面的搜索关键词的简洁有效代码
- 我为啥不想用Python
- Sublime Text 3 Plugin Better!
- mongodb聚合内存不足解决方案
- 在线教育平台HTML代码,在线教育学习管理平台html前端源码模板
- linux内核实时补丁的实现,Canonical释出用于Ubuntu 18.04 LTS和16.04 LTS的新Linux内核实时补丁...
- 全国省市区(县)级地名xml(一)
- linux的4k播放器,【Linux1GB4K(3840*2160)电视播放器】Linux1GB4K(3840*2160)电视播放器报价及图片大全-列表版-ZOL中关村在线...
- 靠微信小程序两周获客20万,同城小程序开始爆发
- 骨传导耳机的利与弊有哪些?骨传导耳机到底好不好?
- Android通知Notification使用全解析,看这篇就够了
- 加餐0 | 前后端快速入门学习路线
- php 判断app浏览器打开,手机浏览器下判断是否安装某app,并判断是否打开该应用...
- python数字精度自动变化_如何在python中将一个数字转换成12位精度?
- matlab dmc仿真实例
- vectorvn1610报价_VECTOR VN1610 CAN Network 通讯模块
- luoguP2495 [SDOI2011]消耗战
- GitBook制作电子书详细教程(命令行版)
- Unresolved Dependencies
热门文章
- [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
- vue3中的tsx写法
- 用 Uno Platform 构建一个 Kanban-style Todo App
- js实现键盘数字输入
- DeepRacer线下比赛总结 2022 地图 Re Invent 2018
- 一周速递|全球车联网产业动态(2022年10月16日)
- C语言--第二篇类型、运算符与表达式
- Word插入题注快捷键
- 小米手机10 青春版(Mi 10 Lite Zoom)TWRP刷入12.5版教程
- eap wifi 证书_WIFI用户EAP-TLS认证.pdf