《标准i o库课件》由会员分享,可在线阅读,更多相关《标准i o库课件(47页珍藏版)》请在金锄头文库上搜索。
1、标准I/O库,标准I/O库,库函数是一些完成常见的特定功能的函数,一般由某个标准组织制作发丰。并形成一定的标准,库函数一般可以应用于不同的平台面不需要做任何修改,具有很好的可移植性。系统调用函数与操作系统直接相关,不同的操作系统使用的调用可能不同,因此可移植性不高。 库函数在实现中也可能需要使用系统调用,但它封装了系统调用操作。用户不必关心使用了哪些系统调用。,文件I/O和标准I/O库的区别,linux的文件I/O是一种低级的I/O,由操作系统提供的基本IO服务, 而标准I/O是ANSIC建立的一种标准IO模型,是一种标准函数包和stdio.h头文件中的定义,具有一定的可移植性。 两者最大区别
2、:标准IO默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构;文件I/O一般没有采用缓冲模式,需要自己创建缓冲区。一种是标准库封装系统调用而成,更高级 ,一种是系统提供的,比较低层 。,1.1 文件基本概念,流和FILE对象,前一节中,我们讲述所有I/O函数都是针对文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。而对于标准I/O库,它们的操作则是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使用一个流与一个文件相关联。,文件流,流是一个抽象的概念,是物质从一处向另一处流动的过程,多用于程序开发中。在程序开发中,流是指信息
3、从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入或从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为“流”。,文件缓冲区,根据应用程序对文件的访问方式,即是否存在缓冲区,文件系统分为缓冲区的文件系统 和非缓冲文件系统。 缓冲文件系统:高级文件系统,系统自动为正在使用的文件开辟内存缓冲区。本章介绍的遵循 ANSI 标准的 I/O 函数使用的就是缓冲文件系统。非缓冲文件系统:低级文件系统,由用户在程序中为每个文件设定缓冲区。 POSIX 标准的系统调用 I/O 函数使用的就是非缓冲文件系统,缓冲文件系统,A,程序数据区,输入文件缓冲区,输入文件缓冲区,磁盘文件
4、,缓冲文件系统,标准的 C 库函数建立在底层系统调用之上,即 C 函数库文件访问函数的实现中使用了文件 I/O 系统调用。 标准的 C 库中的文件处理函数为了减少使用系统调用的次数,提高效率,根据应用的不同,如图所示采用缓冲区机制,这样,在对磁盘文件进行读操作时,可以一次性地从文件中读出大量数据到缓冲区中,以后对这部分数据的访问就不需要再使用系统调用了。在对磁盘文件进行操作时,可以先将内容存储在文件缓冲区中,待文件缓冲区满后再用系统调用将该文件一次写入到磁盘。 根据使用领域的不同需求,标准 C 函数使用了全缓冲、行缓冲和无缓冲 3 种缓冲区处理方式。,全缓冲:这种情况下,在填满标准I/O缓冲区
5、后才进行实行I/O操作。 行缓冲:在这种情况下,当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。当流涉及一个终端时,通常使用行缓冲。 不带缓冲:标准I/O库不对字符进行缓冲存储。,非缓冲文件系统,用户数据区,磁盘,指今区,缓冲区,程序,非缓冲区,非缓冲区的文件访问方式,每次在对该文件进行任何一次读写操作时,都需要使用读写文件系统调用来处理该操作,因 此 ,如 果 用 户程序需要访问磁盘空间中的某个文件,则每访问一次都需要执行一次系统调用。在这个过程中,系统需要从用户空间切换到内核空间,实现上下文的切换,这将损耗一定的 CPU 时间,频繁的磁盘访问对程序的执行效率将造 成很大影响,更改
6、缓冲类型,Void setbuf(FILE *fp, char * buf) Int setvbuf(FILE *fp, char *buf, int mode, size_t size) 返回值:成功返回0,出错返回非0值 这些函数一定要在流已被打开后调用,而且也应该在对流执行任何其他操作之前调用。,1.2 文件指针,文件指针与文件描述符区别,文件描述符,在linux系统中,设备也是以文件的形式存在,要对该设备进行操作就必须先打开这个文件,打开这个文件,就会获得这个文件描述符,它 是个很小的正整数,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。文件描述符的优点:兼容PO
7、SIX标准,许多Linux和UNIX系统调用都依赖于它。文件描述符的缺点:可移植性差,也不直观。 文件指针,C语言中使用的是文件指针,而不是文件描述符做为I/O的句柄.“文件指针(file pointer)“指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符值.而文件描述符值是文件描述符表中的一个索引.从某种意义上说文件指针就是句柄的句柄。,文件指针,流是操作系统抽象出来的概念,其实体由操作系统维护和管理,应用层开发只需使用流即可实现对文件的访问。在应用层面,对文件流的访问通过文件指针 FILE 来实现 系统启动时默认打开了 3 个文件,即至少拥有了
8、 3 个流:标准输入、标准输出和标准出 错,这 3 个流在缺省的情况下可被任意进程使用。在标准 I /O 流中通过预定义 FILE 类型的 文件指针 stdin、stdout 和 stderr 来分别引用标准输入、标准输出和标准出错,FILE结构体,struct _IO_FILE int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ #define _IO_file_flags _flags char* _IO_read_ptr; /* Current read pointer */ /当前读指针 char* _IO_re
9、ad_end; /* End of get area. */ /读区域结束位置 char* _IO_read_base; /* Start of putback+get area. */ char* _IO_write_base;/* Start of put area. */ /输入区起始区 char* _IO_write_ptr; /* Current put pointer. */ /当前写指针 char* _IO_write_end; /* End of put area. */ /写区域结束位置 char* _IO_buf_base; /* Start of reserve area
10、. */ /保留区起始位置 char* _IO_buf_end; /* End of reserve area. */ /保留区结束位置 /* The following fields are used to support backing up and undo. */ char *_IO_save_base; /* Pointer to start of non-current get area. */ char *_IO_backup_base; /* Pointer to first valid character of backup area */ char *_IO_save_en
11、d; /* Pointer to end of non-current get area. */ struct _IO_marker *_markers; struct _IO_FILE *_chain; ,2 标准文件I/O操作,2.1 打开关闭文件,FILE *fopen (_const char *_restrict _filename, _const char *_restrict _modes) 此函数第一个参数是指向欲打开的文件名字符串的指针(如“/ect/services”),可以使用绝对路径或相对路径来指定;第二个参数为打开模式。,文件打开模式,参 数 说 明 r(或 rb)
12、以只读的方式打开文件,该文件必须已经存在 r+(或 rb+) 以可读写的方式打开文件,此文件必须存在 w(或 wb) 以只写的方式打开文件,若该文件存在则清空,若不存在就创建 w+(或 wb+) 以可读写的方式打开文件,若该文件存在则清空,若不存在就创建 a(或 ab) 以只写的方式追加文件,若该文件存在,写入的数据会被追加到文件后面;若文件不存在,就创建 a+(或 ab+) 以可读写的方式追加文件,若该文件存在,在它的尾部读写数据;若文件不存在,就创建 使用字符 b 作为 type 的一部分,使得标准 I/O 系统可以区分文本文件和二进制文件,关闭文件,在完成对流对象的操作后,需要关闭该流对
13、象,在关闭该流对象之前,应将缓冲区中的相关内容回写到磁盘文件中,这一操作由系统完成。 int fclose (FILE *_stream); 如果执行成功,将返回 0,否则返回 EOF,关闭文件,如果需要关闭打开的所有流对象,使用 fcloseall 函数 int fcloseall (void) 执行成功,将返回 0,否则返回 EOF,,更新缓冲区内容,即使缓冲区没有填满,也可以刷新缓冲区内容,即使用 I/O 系统调用将缓冲区内容写回到磁盘中,使用的函数为 fflushint fflush (FILE *_stream) 执行成功,将返回 0,否则返回 EOF,程序实例,int main(i
14、nt argc,char *argv) FILE *fp=NULL; fp=fopen(“try.txt“,“r“); /以只读形式打开文件 try.txt if(fp=NULL) /不成功则输出“fail to open file!n“ printf(“fail to open file!n“); return -1; printf(“open file successfully!n“); fclose(fp); /关闭已打开的文件 return 0; ,2.2 读写文件流,根据应用的不同需要,ANSI 标准提供了 3 种类型的 I/O 处理函数,包括字符读写、行读写和块读写函数。如果使用了
15、缓冲区,则不需要在每次标准 I/O 处理时都调用系统 I/O ,至于什么时候使用系统 I/O 调用由系统完成。,字符读操作,int fgetc (FILE *_stream) int getc (FILE *_stream) int getchar (void); /从标准输入设备 读一个字符 成功则返回读到的内容,如果失败则返回 EOF,字符写操作,int fputc (int _c, FILE *_stream);/写字符 c 到流 stream 中 int putc (int _c, FILE *_stream) int putchar (int _c); /写字符 c 到标准输出设备
16、成功则返回内容,如果失败则返回 EOF,程序实例,int main(int argc,char *argv) FILE *fp=NULL; char ch; if(argc=1) printf(“check usage of %s n”,argv0); return -1; if(fp=fopen(argv1,“r”)=NULL) /以只读形式打开 argv1所指明的文件 printf(“can not open %sn”,argv1); return -1; while (ch=fgetc(fp)!=EOF)/把文件中的数据逐个的输出到标准输出stdout fputc(ch,stdout); fclose(fp); /关闭文件 return 0; ,行读入文件流,