第5章 标准I/O库

来源:互联网 发布:枕头高度 知乎 编辑:程序博客网 时间:2024/05/17 05:56
  1. 流的定向决定了所读、写的字符是单字节还是多字节的。(如ASCII字符集是单字节的,国际字符集是多字节的)
    #include<stdio.h>#include<wchar.h>int fwide(FILE *fp, int mode)宽定向返回正值,字节定向返回负值,未定向返回0fwide并不改变已定向的流方向
  2. 三个标准I/O流通过预定义文件指针stdin、stdout和stderr加以引用。
  3. 缓冲
    标准I/O库提供缓冲的目的是尽可能减少使用read和write调用次数。
    UNIX里面关于标准IO的几种缓冲机制:
    1、全缓冲 。全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。一般调用malloc获得缓冲区,调用fflush强制写入磁盘
    2、行缓冲 。在这种情况下,标准IO在输入和输出中遇到换行符时执行IO操作;注意,当流涉及终端的时候,通常使用的是行缓冲。
    3、无缓冲 。无缓冲指的是标准IO库不对字符进行缓冲存储;注意,标准出错流stderr通常是无缓冲的。
  4. 标准I/O效率
    图5-6中显示了对统一文件(98.5MB,300万行)进行行操作多的的数据

    对于这三个标准的io版,其用户时间都大于表3-2中的最佳read版本,因为在每次读一个字符的标准I/O版本中有一个要执行一亿次的循环。而对每读一行的版本要执行三百万多次循环。在read版本中,其循环只需执行12611次,主要决定了缓冲区的长度8192字节。
    其差别就是在cpu时间和等待I/O结束所消耗的时间。
  5. 临时文件
    #include<stdio.h>功能产生一个唯一的文件名函数原型char *tmpnam(char *sptr);
    sptr可以是NULL或者一个栈地址。当sptr为NULL时,返回一个内部静态内存地址(保存了临时文件名),当下一次以NULL调用函数的时候,该内存会被修改。栈地址必须至少有L_tmpnam内存,这样名字保存在那个数组里面,如数组 char buffer [L_tmpnam],注意用此文件名去打开文件流所创建的文件都是临时性的。tmpnam可以被一个程序最多调用TMP_MAX(最少为几千次),每一次它都会返回一个不同的文件名。
    功 能以wb+形式创建一个临时二进制文件函数原型FILE *tmpfile(void);
    标准I/O库中提供了两个函数来创建临时文件,这个函数是其中之一,另外一个是tmpnam。值得注意的是,每调用一次tmpnam,就产生一个不同的文件名,最多调用次数为TMP_MAX,该宏定义在<stdio.h>中。创建的临时文件在程序退出时会被自动删除。
  6. 内存流
    标准I/O库把数据缓存在内存中,因此每次一个字符和每次一行的I/O更有效。我们可以通过调用setbuf货setvbuf函数让I/O库使用我们自己的缓冲区。


1 0