实例分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实例—— fopen和getc函数的实现 下面以标准库函数fopen 和getc 的一种实现方法为例来说明如何将这些系统调用结合起来使用。 我们回忆一下,标准库中的文件不是通过文件描述符描述的,而是使用文件指针描述的。 文件指针是一个指向包含文件各种信息的结构的指针,该结构包含下列内容:一个指向缓冲区的指针,通过它可以一次读入文件的一大块内容;一个记录缓冲区中剩余的字符数的计数器;一个指向缓冲区中下一个字符的指针;文件描述符;描述读/写模式的标志;描述错误状态的标志等。 描述文件的数据结构包含在头文件stdio.h中,任何需要使用标准输入/输出库中函 数的程序都必须在源文件中包含这个头文件(通过#include指令包含头文件)。此文件也被 库中的其它函数包含。在下面这段典型的stdio.h代码段中,只供标准库中其它函数所使 用的名字以下划线开始,因此一般不会与用户程序中的名字冲突。所有的标准库函数都遵循该约定。 #define NULL 0 #define EOF (-1) #define BUFSIZ 1024 #define OPEN_MAX 20 /* max #files open at once */ typedef struct _iobuf { int cnt; /* characters left */ char *ptr; /* next character position */ char *base; /* location of buffer */ int flag; /* mode of file access */ int fd; /* file descriptor */ } FILE; extern FILE _iob[OPEN_MAX]; #define stdin (_iob[0]) #define stdout (_iob[1]) #define stderr (_iob[2]) enum _flags { _READ = 01, /* file open for reading */ _WRITE = 02, /* file open for writing */ _UNBUF = 04, /* file is unbuffered */ _EOF = 010, /* EOF has occurred on this file */ _ERR = 020 /* error occurred on this file */ }; int _fillbuf(FILE *); int _flushbuf(int, FILE *); #define feof(p) ((p)-flag _EOF) != 0) #define ferror(p) ((p)-flag _ERR) != 0) #define fileno(p) ((p)-fd) #define getc(p) (--(p)-cnt = 0 \ ? (unsigned char) *(p)-ptr++ : _fillbuf(p)) #define putc(x,p) (--(p)-cnt = 0 \ ? *(p)-ptr++ = (x) : _flushbuf((x),p)) #define getchar() getc(stdin) #define putcher(x) putc((x), stdout) 宏getc 一般先将计数器减1,将指针移到下一个位置,然后返回字符。(前面讲过,一个长的#define语句可用反斜杠分成几行。)但是,如果计数值变为负值,getc就调用函数 _fillbuf填充缓冲区,重新初始化结构的内容,并返回一个字符。返回的字符为unsigned 类型。以确保所有的字符为正值。 尽管在这里我们并不想讨论一些细节,但程序中还是给出了putc函数的定义,以表明它 的操作与getc 函数非常类似,当缓冲区满时,它将调用函数_flushbuf。此外,我们还在 其中包含了访问错误输出、文件结束状态和文件描述符的宏。 下面我们来着手编写函数fopen。fopen函数的主要功能是打开文件,定位到合适的位 置,设置标志位以指示相应的状态。它不分配任何缓冲区空间,缓冲区的分配是在第一次读文件时由函数_fillbuf完成的。 #include fcntl.h #include syscalls.h #define PERMS 0666 /* RW for owner, group, others */ FILE *fopen(char *name, char *mode) { int fd; FILE *fp; if (*mode != r *mode != w *mode != a) return NULL;

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档