<<UNIX环境高级编程>>之第五章理解

第五章:标准I/O库
一.引言:
其处理很多细节,例如缓存分配,以优化长度执行I/O等,这样使用户不必担心如何选择使用正确的块长度.(3.9节)
二.流和FILE对象:
第三章中所有I/O函数都是针对文件描述符来描述的.
而对于标准I/O库,它们的操作则是围绕流(stream)进行的.当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相结合.
tips:当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针.该对象通常是一个结构,它包含了I/O库为管理该流所需要的所有信息:用于实际I/O的文件描述符,指向流缓存的指针,缓存的长度,当前在缓存中的字符数,出错标志等等.
三.标准输入,标准输出,标准出错(反复出现)
文件描述符STDIN_FILENO,STDOUT_FILENO,STDERR_FILRNO.
这三个标准I/O流通过预定义文件指针stdin,stdout,stderr加以引用.头文件为stdio.h
四.缓存:
目的:提供缓存的目的是尽可能减少使用read和write函数.
三种类型缓存:
1.全缓存:当填满标准I/O缓存后才进行实际I/O操作.
术语刷新(flush)说明标准I/O缓存的写操作.缓存可由标准I/O例程自动地刷新.在标准I/O库方面刷新意味着将缓存中的内容写到磁盘上.并且刷新一个流.
2.行缓存:当在输入和输出中遇到新行符时,标准I/O库执行I/O操作,比如终端,典型行缓存.
限制:1.行的缓存长度是固定的,只要填满了就会执行.2.任何时候只要通过标准输入输出库要求从a)一个不带缓存的流,b)一个行缓存流得到输入数据,那么就会造成刷新所有行缓存输出流.
3.不带缓存:标准I/O库不对字符进行缓存.
ANSI C要求下列缓存特征:
1)当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的.
2)标准出错绝不会是全缓存的.
对任何一个给定的流,使用setbuf和setvbuf函数可以更改缓存类型,这些函数一定要在流已被打开后调用.
五.打开流:

#include <stdio.h>
FILE *fopen(const char *pathname,const char* type);
FILE *freopen(const char * pathname,const cha* type,FILE *fp);
FILE *fdopen(int filedes,const char *type);

区别:
1)fopen打开路径名由pathname指定;
2)freopen在一个特定的流上(由fp指示)打开一个指定的文件(路径名由pathname指示0,如若该流已经打开,则先关闭该流.
3)fdopen取一个现存的文件描述符(我们可能从open,dup,dup2,fcntl或pipe函数得到此文件描述符),并使一个标准的I/O流与该描述符相结合.
type参数指定对该I/O流的读写方式,ANSI C规定type参数可以有15种不同的值.
六.读和写流:
每次一个字符:
输入函数:
int getc(FILE fp*);
int fgetc(FILE fp*);
int getchar(void);
输出函数:
int putc(int c,FILE *fp);
int fputc(int c,FILE *fp):
int putchar(int c);
其中getc和putc可被实现为宏.
七:每次一行I/O:

#include <stdio.h>
char *fgets(char *buf,int n,FILE *fp);
char *gets(char *buf);

显然gets很坑不指定缓冲器大小,最好别用;
输出:
int fputs(const char *str,FILE *fp);
int puts(const char *str);
函数fputs将一个以null符终止的字符串写到制定的流,纸质符NULL不写出.
这并不一定输出一行,因为它并不要求在null符之前一定是新行符.
函数puts将一个以null符终止的字符串写到标准输出,终止符不写处,但是puts然后又将一个换行符写到标准输出.
所以最好使用fgets和fputs,避免出错.
八.标准I/O效率:
使用前面所述的函数,我们应该对标准I/O系统效率有所了解.
tips:我们经常在代码中没有显示的关闭标准I/O流,但是我们知道exit函数将会刷新任何未写的数据,然后关闭所有打开的流.
九.二进制I/O:
fread函数.(第八章)
十.定位流:

#include <stdio.h>
int fgetpos(FILE fp*,fpos_t *pos);
int fsetpos(FILE fp*,const fpos_t *pos);

十一.格式化I/O:

#include <stdio.h>
int printf(const char *format,...);
int fprintf(FILE fp*,const char *format,...);
int sprintf(char *buf,const char *format,...);

printf将格式化数据写到标准输出,fprintf写至指定的流,sprintf将格式化的字符送入数组buf中.
sprintf在该数组的尾端自动加一个null字节,但该字节不包括在返回值中.
格式化输入:

#include <stdio.h>
int scanf(const char *format,...);
int fscanf(FILE *fp,const char *format,...);
int sscanf(const char*buf,const char *format,...);

十二.实现细节:略过,看书.
十三.临时文件:标准I/O库提供了两个而函数以帮助创建临时文件.

#include <stdio.h>
char * tmpnam(char * ptr);
FILE *tmpfile(void);

tmpname产生一个与现在文件名不同的一个有效路径名字符串.每次调用它,都会产生一个不同的路径名.
tmpfile创建一个临时二进制文件,在关闭该文件或程序结束时将自动删除这种文件.
tips:unix对二进制文件不作特殊区分.
这一章过一遍即好.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值