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;
}

本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/3648307.html,如需转载请自行联系原作者

c程序设计语言_习题8-4_重新实现c语言的库函数fseek(FILE*fp,longoffset,intorigin)相关推荐

  1. 判断数组相同数c语言_单片机常用的14个C语言算法,看过的都成了大神!

    算法(Algorithm):计算机解题的基本思想方法和步骤. C语言入门视频教程_9天精通Linux C语言 - 创客学院​www.makeru.com.cn 算法的描述:是对要解决一个问题或要完成一 ...

  2. 会员计费系统c语言_酒店管理与计费系统( c语言课程设计).doc

    酒店管理与计费系统( c语言课程设计).doc 还剩 19页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: pr ...

  3. c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格...

    Write a program to copy its input to its output, replacing each string of one or more blanks by a si ...

  4. 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 用类制造对象. ...

  5. java语言程序设计你_清华大学出版社-图书详情-《Java语言程序设计》

    前言 Java语言是一种典型的面向对象的.跨平台的.支持分布式和多线程的优秀编程语言,具有极强的扩展性.自其诞生以来,迅速被业界认可并广泛应用于Web应用程序的开发中.在此形势下,国内高校在计算机及相 ...

  6. C语言_习题4-5 换硬币

    习题4-5 换硬币 (20 分) 将一笔零钱换成5分.2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法? 输入格式: 输入在一行中给出待换的零钱数额x∈(8,100). 输出格式: 要求按5 ...

  7. c语言程序设计实验与习题指导 第2版,C语言程序设计实验与习题指导(第2版)参考答案.doc...

    参考答案 引言 选择题 DBCAC-CCADD-CACCB-ACDBD 填空题 c 顺序结构分支结构循环结构 复合 语句 字母.数字.下划线 main()函数 数据表达数据处理 .exe 编译连接 判 ...

  8. java动态语言_探秘Java 7:JVM动态语言支持详解

    JDK 7 增加了对 JSR 292 的支持,在 JVM 中动态类型语言的运行速度将变得更快.这一支持的关键在于增加了新的 Java 字节码,invokedynamic,它用于方法调用,还有新的连接机 ...

  9. aes算法实现c语言_消息摘要算法MD5图解及C语言实现

    前言 最近看了很多关于消息摘要算法这方面的资料,既有CSDN上面各路大神写的文章,也有这些算法的标准文档.有的讲的比较啰嗦,有的给出来的代码是直接调库的.我想写一篇文章,帮助自己理清思路,利用图解简明 ...

最新文章

  1. CSS3-多媒体查询
  2. java if语句选择题_选择语句(if else) 习题(2017/12/1)
  3. TF之DNN:对DNN神经网络进行Tensorboard可视化(得到events.out.tfevents本地服务器输出到网页可视化)
  4. [Qt教程] 第32篇 网络(二)HTTP
  5. SAP Spartacus的ComponentFactory和ComponentFactoryResolver - 动态添加outlet
  6. Java short 无符号右移_char类型byte类型或short类型进行无符号右移遇到的神奇问题...
  7. php 两变量值互换 方法
  8. 技术文档的撰写_如何撰写出色的技术博客文章
  9. 同一个目录下html页面跳转,webpack打包多页应用,如何处理不同html页面(通过a标签)之间的跳转?...
  10. poj 1655 树的重心 define注意事项
  11. AS3.0 XMLSocket简介
  12. Django入门10--admin增强
  13. 怎样取消隐式推送_九推,怎样寻找捡漏的机会?
  14. IE各浏览器HACK
  15. linux裸磁盘的配置,【存储】nas模拟裸磁盘挂载swift
  16. Navitas GaN IC 驱动 Vivo 可折叠手机
  17. Excel不同列多条件计数
  18. Week7 B - TT 的旅行日记
  19. 解决win10新装系统无法登录微软账户及microsoft store
  20. utools01-分享一个极简的多功能高效率工作神器

热门文章

  1. SIFT特征提取算法总结
  2. 【POCO】POCO学习总结(三)——交叉编译
  3. php与nginx通讯方式,[Linux]PHP-FPM与NGINX的两种通讯方式
  4. 为什么博图中放置按下按钮无反应_如何更好的设计按钮
  5. php关机启动不了,win10关机关不掉怎么办
  6. java不能连接mysql,无法使用Docker将Java程序连接到MySQL
  7. Docker初学5:下载安装可视化图形工具Portainer
  8. Java项目:网上家具商城平台设计和实现(java+springboot+mysql+ssm)
  9. 【java】兴唐第十五节课
  10. java排序算法(冒泡,插入,选择,快速,堆,归并,希尔,基数)