设为首页 加入收藏

TOP

C 标准I/O库粗略实现(四)
2018-10-21 18:11:01 】 浏览:257
Tags:标准 I/O 粗略 实现
LL){ return EOF; } } f->ptr = f->base; int n = read(f->fd,f->ptr,BUFSIZ); //系统调用read if(n == 0){ //到达文件结尾 f->base = NULL; f->cnt = 0; f-> flag |= _EOF; return EOF; }else if(n == -1){ //出错 f->cnt= 0; f->flag |= _ERR; return EOF; }else{ f->cnt = --n; return *f->ptr++; } } int _flushbuf(int x,FILE *f){ if((f->flag & (_WRITE | _EOF | _ERR)) != _WRITE){ return EOF; } int n; int bufsize = f->flag & _UNBUF ? 1 : BUFSIZ; if(f->base != NULL){ n = write(f->fd,f->base,f->ptr - f->base); //判断需要写入多少字节 if(n != f->ptr - f->base){ f->flag |= _ERR; return EOF; } }else{ if((f->base = (char *)malloc(bufsize)) == NULL){ f->flag |= _ERR; return EOF; } } if(x != EOF){ f->cnt = bufsize - 1; f->ptr = f->base; *f->ptr++ = x; }else{ //当写入EOF时,代表强制刷新缓冲区内容到文件中 f->cnt = bufsize; f->ptr = f->base; } return x; } /** * @brief _fflush * @param f * @return */ int _fflush(FILE *f){ int res = 0; if(f == NULL){ for(int i = 0; i < OPEN_MAX; i++){ //当参数为NULL时,刷新所有的文件流 if((f->flag & _WRITE) && (_fflush(&_iob[i]) == -1)){ //有一个出错即返回-1 res = EOF; } } }else{ if(f->flag & _WRITE){ _flushbuf(EOF,f); }else{ res = EOF; } } if(f->flag & _ERR){ //出错 res = EOF; } return res; } int _fclose(FILE *f){ int ret; if((ret = _fflush(f)) != EOF){ free(f->base); f->base = NULL; f->ptr = NULL; f->fd = 0; f->flag = 0; //@TODO } return 0; } int _fseek(FILE *f,long offset,int origin){ int rc; if(f->flag & _READ) { if(origin == 1) { offset -= f->cnt; } rc = lseek(f->fd,offset,origin); f->cnt = 0; //将缓冲区剩余字符数清0 }else if(f->flag & _WRITE) { rc = _fflush(f); //强制刷新缓冲区 if(rc != EOF) { rc = lseek(f->fd,offset,origin); } } return rc == -1 ? EOF : 0; } int _getc(FILE *f){ return --f->cnt >= 0 ? *f->ptr++ : _fillbuf(f); } int _putc(int x,FILE *f){ return --f->cnt >= 0 ? *f->ptr++ = x : _flushbuf(x,f); } int _getchar(){ return _getc(stdin); } int _putchar(int x){ return _putc(x,stdout); } FILE *_fopen(char *file,char *mode){ int fd; FILE *fp; if(*mode != 'r' && *mode != 'w' && *mode != 'a') { return NULL; } for(fp = _iob; fp < _iob + OPEN_MAX; fp++) { //寻找一个空闲位置 if (fp->flag == 0){ break; } } if(fp >= _iob + OPEN_MAX){ return NULL; } if(*mode == 'w'){ fd = creat(file,PERMS); }else if(*mode == 'r'){ fd = open(file,O_RDONLY,0); }else{ //a模式 if((fd = open(file,O_WRONLY,0)) == -1){ fd = creat(file,PERMS); } lseek(fd,0L,2); //文件指针指向末尾 } if(fd == -1){ return NULL; } fp->fd = fd; fp->cnt = 0; //fopen不分配缓存空间 fp->base = NULL; fp->ptr = NULL; fp->flag = *mode == 'r' ? _READ : _WRITE; return fp; } int main(int argc,char *argv[]){ FILE *f = _fopen("zyc.txt","a"); /*char c; for(int i = 0; i < 10; i++){ c = _getc(f); }*/ /*for(int i = 0; i < 9; i++){ _putc('6',f); } _fseek(f,-5,1); for(int i = 0; i < 9; i++){ _putc('8',f); } _fclose(f);*/ int c; while((c = _getchar()) != '\n'){ _putchar(c); } _fclose(stdout); return 0; }

上面提到的部分函数在Answer to Exercise 8-3, page 179中有更详细的实现。

参考资料:

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇十六进制带小数转换成十进制 下一篇关于C语言中static保留字的使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目