c程序设计语言_习题8-4_重新实现c语言的库函数fseek(FILE*fp,longoffset,intorigin)
fseek库函数
#include <stdio.h> int fseek(FILE *stream, long int offset, int origin); 返回:成功为0,出错为非0
对流stream相关的文件定位,随后的读写操作将从新位置开始。
对于二进制文件,此位置被定位在由origin开始的offset个字符处。origin的值可能为SEEK_SET(文件开始处)、SEEK_CUR(当前位置)或SEEK_END(文件结束处)。
对于文本流,offset心须为0,或者是由函数ftell()返回的值(此时origin的值必须是SEEK_SET)(这里关于与ftell函数的交互,不是很理解。)。
ftell库函数
#include <stdio.h> long int ftell(FILE *stream);
返回与流stream相关的文件的当前位置。出错时返回-1L。
fflush库函数
#include <stdio.h> int fflush(FILE *stream); 返回:成功为0,失败返回EOF
对输出流(写打开),fflush()用于将已写到缓冲区但尚未写出的全部数据都写到文件中;对输入流,其结果未定义。如果写过程中发生错误则返回EOF,正常则返回0。
fflush(NULL)用于刷新所有的输出流。
程序正常结束或缓冲区满时,缓冲区自动清仓。
lseek库函数
头文件:#include <sys/types.h> #include <unistd.h>定义函数:off_t lseek(int fildes, off_t offset, int whence);
lseek函数不是ANSI C标准库函数,只是满足POSIX的UNIX下的函数。
函数说明:
每一个已打开的文件都有一个读写位置, 当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾. 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置. 参数fildes 为已打开的文件描述词, 参数offset 为根据参数whence来移动读写位置的位移数.
涉及到的枚举变量
enum _flags{_READ = 01,_WRITE = 02,_UNBUF = 04,_EOF = 010,_ERR = 020};
--------------------代码实现----------------------------
The standard library function
1
|
int fseek(FILE*fp, long offset, int origin)
|
is identical to lseek
except that fp
is a file pointer instead of a file descriptor and the return value is an int
status, not a position. Write fseek
. Make sure that your fseek
coordinates properly with the buffering done for the other functions of the library.
Here's Gregory's first solution:
/* Gregory Pietsch -- My category 0 solution to 8-4 */int fseek(FILE *f, long offset, int whence) {if ((f->flag & _UNBUF) == 0 && base != NULL) {/* deal with buffering */if (f->flag & _WRITE) {/* writing, so flush buffer */fflush(f); /* from 8-3 */} else if (f->flag & _READ) {/* reading, so trash buffer */f->cnt = 0;f->ptr = f->base;}}return (lseek(f->fd, offset, whence) < 0); }
...and here's his second, which is considerably more comprehensive:
/*[The following solution is in the zip file as krx80401.c - RJH (ed.) ]EXERCISE 8-4I thought I'd improve 8-4 too. I'm trying my best to get this as close to ISO C as possible given the restrictions that I'm under. (A real implementation would have fsetpos() borrow some of the same code.)*//* Gregory Pietsch -- My category 0 solution to 8-4 */#define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2int fseek(FILE *f, long offset, int whence) {int result;if ((f->flag & _UNBUF) == 0 && base != NULL) {/* deal with buffering */if (f->flag & _WRITE) {/* writing, so flush buffer */if (fflush(f))return EOF; /* from 8-3 */} else if (f->flag & _READ) {/* reading, so trash buffer --* but I have to do some housekeeping first*/if (whence == SEEK_CUR) {/* fix offset so that it's from the last * character the user read (not the last* character that was actually read)*/if (offset >= 0 && offset <= f->cnt) {/* easy shortcut */f->cnt -= offset;f->ptr += offset;f->flags &= ~_EOF; /* see below */return 0;} elseoffset -= f->cnt;}f->cnt = 0;f->ptr = f->base;}}result = (lseek(f->fd, offset, whence) < 0);if (result == 0)f->flags &= ~_EOF; /* if successful, clear EOF flag */return result; }
c程序设计语言_习题8-4_重新实现c语言的库函数fseek(FILE*fp,longoffset,intorigin)相关推荐
- 判断数组相同数c语言_单片机常用的14个C语言算法,看过的都成了大神!
算法(Algorithm):计算机解题的基本思想方法和步骤. C语言入门视频教程_9天精通Linux C语言 - 创客学院www.makeru.com.cn 算法的描述:是对要解决一个问题或要完成一 ...
- 会员计费系统c语言_酒店管理与计费系统( c语言课程设计).doc
酒店管理与计费系统( c语言课程设计).doc 还剩 19页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: pr ...
- c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格...
Write a program to copy its input to its output, replacing each string of one or more blanks by a si ...
- java语言程序设计视频_[VIP视频]【A0152】Java语言程序设计进阶高级进阶视频教程 网易云课堂 百度网盘 云盘...
Java语言程序设计进阶-云课堂' S0 c5 z4 C* S: n: K/ D ├─第1周 类和对象 9 i5 N/ j$ I9 d9 z9 t# [# U: D│ 1.1 用类制造对象. ...
- java语言程序设计你_清华大学出版社-图书详情-《Java语言程序设计》
前言 Java语言是一种典型的面向对象的.跨平台的.支持分布式和多线程的优秀编程语言,具有极强的扩展性.自其诞生以来,迅速被业界认可并广泛应用于Web应用程序的开发中.在此形势下,国内高校在计算机及相 ...
- C语言_习题4-5 换硬币
习题4-5 换硬币 (20 分) 将一笔零钱换成5分.2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法? 输入格式: 输入在一行中给出待换的零钱数额x∈(8,100). 输出格式: 要求按5 ...
- c语言程序设计实验与习题指导 第2版,C语言程序设计实验与习题指导(第2版)参考答案.doc...
参考答案 引言 选择题 DBCAC-CCADD-CACCB-ACDBD 填空题 c 顺序结构分支结构循环结构 复合 语句 字母.数字.下划线 main()函数 数据表达数据处理 .exe 编译连接 判 ...
- java动态语言_探秘Java 7:JVM动态语言支持详解
JDK 7 增加了对 JSR 292 的支持,在 JVM 中动态类型语言的运行速度将变得更快.这一支持的关键在于增加了新的 Java 字节码,invokedynamic,它用于方法调用,还有新的连接机 ...
- aes算法实现c语言_消息摘要算法MD5图解及C语言实现
前言 最近看了很多关于消息摘要算法这方面的资料,既有CSDN上面各路大神写的文章,也有这些算法的标准文档.有的讲的比较啰嗦,有的给出来的代码是直接调库的.我想写一篇文章,帮助自己理清思路,利用图解简明 ...
最新文章
- CSS3-多媒体查询
- java if语句选择题_选择语句(if else) 习题(2017/12/1)
- TF之DNN:对DNN神经网络进行Tensorboard可视化(得到events.out.tfevents本地服务器输出到网页可视化)
- [Qt教程] 第32篇 网络(二)HTTP
- SAP Spartacus的ComponentFactory和ComponentFactoryResolver - 动态添加outlet
- Java short 无符号右移_char类型byte类型或short类型进行无符号右移遇到的神奇问题...
- php 两变量值互换 方法
- 技术文档的撰写_如何撰写出色的技术博客文章
- 同一个目录下html页面跳转,webpack打包多页应用,如何处理不同html页面(通过a标签)之间的跳转?...
- poj 1655 树的重心 define注意事项
- AS3.0 XMLSocket简介
- Django入门10--admin增强
- 怎样取消隐式推送_九推,怎样寻找捡漏的机会?
- IE各浏览器HACK
- linux裸磁盘的配置,【存储】nas模拟裸磁盘挂载swift
- Navitas GaN IC 驱动 Vivo 可折叠手机
- Excel不同列多条件计数
- Week7 B - TT 的旅行日记
- 解决win10新装系统无法登录微软账户及microsoft store
- utools01-分享一个极简的多功能高效率工作神器
热门文章
- SIFT特征提取算法总结
- 【POCO】POCO学习总结(三)——交叉编译
- php与nginx通讯方式,[Linux]PHP-FPM与NGINX的两种通讯方式
- 为什么博图中放置按下按钮无反应_如何更好的设计按钮
- php关机启动不了,win10关机关不掉怎么办
- java不能连接mysql,无法使用Docker将Java程序连接到MySQL
- Docker初学5:下载安装可视化图形工具Portainer
- Java项目:网上家具商城平台设计和实现(java+springboot+mysql+ssm)
- 【java】兴唐第十五节课
- java排序算法(冒泡,插入,选择,快速,堆,归并,希尔,基数)