1几个有关函数标准库还提供了另外一些与IO有关的函数。1)缓冲区冲刷函数fflush。原型:intfflush(FILE*stream)对输出流有定义。要求立即将缓冲区数据写入文件。本操作对输入流的作用在标准里没有定义。正常完成返回0,出错返回EOF。2)文件结束判断函数feof。其原型是:intfeof(FILE*stream)判断是否到达文件末尾。主要用于二进制文件,遇到文件结束时返回非0值。23)文件定位及定位函数文件可看作字节的序列,每个字节在序列中有一位置。可认为IO时有一个文件位置指示器。以读/写方式打开时指示器设在文件开头,以附加方式打开指示器设在文件尾。指示器随读写操作自动后移,指向下次操作位置。为方便,标准库提供了直接操作文件指示器的函数:文件定位函数/指示器移动函数。最常用的三个:voidrewind(FILE*st)将流st的文件指示器重设到文件开始位置。longftell(FILE*st)返回流st当时指示器位置。出错返回-1L。3intfseek(FILE*st,longoffset,intorigin)设置流st的指示器,使随后IO操作在新位置进行。origin指定定位基准点,可能取值:SEEK_SET以文件头作为定位的基准点SEEK_CUR以指示器的当前位置作为基准点SEEK_END以文件尾作为基准点正文流的移动操作有限制。对二进制流没限制,移动目标是以origin为基准点偏移offset的位置。4出错处理输出出错信息是希望显示到屏幕供人读。通过stdout不合适:输出定向到文件也使出错信息送到文件。送到标准错误流stderr的信息不受定向影响。改造前面程序cat,只需要改动一个语句:fprintf(stderr,%s,can'topeninfile:%s\n,name,*argv);•文件错误检查:intferror(FILE*stream)IO出错时设置相关流的出错标志变量。ferror检查流的出错标志。当stream的状态变量设置时返回非0。•错误标志复位(清除)函数voidclearerr(FILE*stream)5标准库错误处理:为检查程序执行中出错,库提供了一些机制。每个C系统定义了一组错误编号,0表示无错,其余值表示各种错误。一些函数出错时自动给状态变量errno设错误编号,还定义了相应的信息串。见errno.h。•打印当时错误信息:voidperror(char*s)检查当时错误编号(perror调用之前的最近错误),把对应信息串送到stderr。输出形式:字符串s冒号错误信息串换行69.5标准库介绍标准库由一组库代码文件和一组头文件组成。代码文件内是标准函数的程序代码及相关数据(变量)。若程序调用标准函数,连接程序将从库代码文件提取函数代码,将其拼接到结果程序里,并完成调用连接。库代码文件里还附带了一些连接程序使用的信息。ANSIC的标准头文件是一组正文文件,提供库函数的使用信息。其中列出库函数原型,所用类型(如FILE)、符号常量(如EOF、NULL)和其他宏定义等。7在C程序里用标准库函数,只需包含有关的头文件,这将保证程序对标准库函数的使用与其实际定义间的一致性。库代码文件通常很大,具体程序实际使用的库功能通常只是其中很少一部分。人们开发了这样的技术,在程序连接时不是把库代码文件整个装配到可执行文件里,而是根据实际需要,由库文件里提取出必要部分装配进程序里,以保证用户程序的紧凑性。89.5.1几个已经介绍过的头文件math.hctype.h字符串函数(string.h):char*strchr(cs,c);char*strrchr(cs,c);查寻字符c在字符串cs里出现的位置(第一个,或者最后一个)。cs表示constchar*(const字符串),s表示char*(字符数组),用c表示字符。9char*strpbrk(cs1,cs2);查寻cs2中的字符在cs1里第一次出现的位置。char*strstr(cs1,cs2);查寻cs2(子串)在cs1中出现的位置。成功时返回所确定位置的指针,失败返回空指针。size_tstrspn(cs1,cs2);cs1的所有字符都属于cs2的前缀的长度;size_tstrcspn(cs1,cs2);cs1的所有字符都不属于cs2的前缀的长度。“前缀”:字符串开始的一段。10char*strtok(s,ct);是个比较复杂的函数。其基本功能是用于在字符数组s中标识出一段段字符,字符段之间原来由ct里的字符分隔(ct是分隔字符的数组)。另有一组存储块操作函数:复制memcpy、移动(允许重叠)memmove、比较memcmp、位置查找memchr、设置memset。119.5.2一些功能函数,stdlib.h随机数生成和动态存储分配函数已介绍。几个整数函数intabs(intn)求整数绝对值longlabs(longn)求长整数绝对值div_tdiv(intn,intm)ldiv_tldiv(longn,longm)将n/m的商和余数存入结果结构的对应成员div_t和ldiv_t是预定义结构类型,的成分是int或者long的的quot和rem。12数值转换从数字字符串构造各种数值类型的值:doubleatof(constchar*s)由串s构造一个双精度值intatoi(constchar*s)由串s构造一个整数值longatol(constchar*s)由串s构造一个长整数值13执行控制。几个有关程序执行结束的函数:voidabort(void)程序立即非正常终止。voidexit(intstat)程序立即正常终止,stat为程序出口值,0表示成功结束。另可用常数:EXIT_SUCCESS、EXIT_FAILURE。程序结束前关闭所有文件。可要求程序结束前做些动作,通过函数atexit登记:intatexit(void(*fcn)(void))把函数fcn登记为结束动作,可多次登记。fcn应是无参无返回值的函数。atexit在登记正常返回值0,否则返回非零值。14与执行环境交互intsystem(constchar*s)把串s传给程序环境,要求将它作为系统命令执行。用NULL调用函数返回非0值表示环境里有命令解释器(可以用这个方式检查命令解释器的存在)。s非NULL时返回值由实现确定。char*getenv(constchar*s)取回与串s相关的环境串。找不到时返回NULL。函数执行结果由实现确定。在许多执行环境里可以用这个函数查看环境变量的值。15bsearch在一批数据里查找某个项:void*bsearch(constvoid*key,constvoid*base,size_tn,size_tsize,int(*cmp)(constvoid*keyval,constvoid*datum))cmp应与strcmp类似,在数keyval与datum相比更大/相等/更小时分别返回正/零/负值。设数组base[0]..base[n-1]元素按cmp序上升排列,元素大小为size。bsearch以*key为比较依据在数组里查找匹配元素(使cmp值等于0的元素),返回指向该元素的指针。找不到时返回NULL。16qsort用于把一组数据按指定顺序排列:voidqsort(void*bs,size_tn,size_tsize,int(*cmp)(constvoid*,constvoid*))cmp与bsearch的要求一样。设bs[0],...,bs[n-1]元素大小为size,qsort把bs元素按照上升顺序重排。17函数bsearch和qsort使用的一个例子:int*p,k=7;inta[]={5,6,3,28,23,34,7,9,6,14};inticmp(constvoid*p,constvoid*q){int*m=(int*)p,*n=(int*)q;return*n*m?1:(*n==*m?0:-1);}18intmain(){......qsort(a,NTERMS(a),sizeof(int),icmp);/*a的元素已按上升顺序排列*/p=bsearch(&k,a,NTERMS(a),sizeof(int),icmp);/*指针p将指向数组a中元素7的位置*/...…return0;}199.5.3关于日期和时间的函数,time.h定义了几个时间类型,说明了许多函数。time_t和clock_t是表示时间的数值类型:clock_t表示计时时间;time_t表示某种日历时间,从历史的某时刻开始计算。定义了时间结构structtm,成分:inttm_sec;剩余秒数(0~61)inttm_min;剩余分钟数(0~59)inttm_hour;剩余小时数(0~23)inttm_mday;月中日数(1~31)inttm_mon;年中月数(1~12)inttm_year;1900后的年序数inttm_wday;星期中日序数(0~6)inttm_isday;夏季时标志inttm_yday;年中日序数(0~365)