
C语言标准库19【稻谷书屋】.ppt
19页几个有关函数几个有关函数标准库还提供了另外一些与标准库还提供了另外一些与IO有关的函数有关的函数1))缓冲区冲刷函数缓冲区冲刷函数fflush原型: int fflush(FILE *stream)对对输输出出流流有有定定义义要要求求立立即即将将缓缓冲冲区区数数据据写写入入文文件件本本操操作作对对输输入入流流的的作作用用在在标标准准里里没没有有定定义义正正常常完完成成返返回回0,出错返回,出错返回EOF2)文件结束判断函数)文件结束判断函数feof其原型是:其原型是: int feof(FILE *stream)判判断断是是否否到到达达文文件件末末尾尾主主要要用用于于二二进进制制文文件件,,遇遇到到文文件结束时返回非件结束时返回非0值值1教育3)文件定位及定位函数)文件定位及定位函数文文件件可可看看作作字字节节的的序序列列,,每每个个字字节节在在序序列列中中有有一一位位置置可认为可认为IO时有一个文件位置指示器时有一个文件位置指示器以以读读/写写方方式式打打开开时时指指示示器器设设在在文文件件开开头头,,以以附附加加方方式式打打开开指指示示器器设设在在文文件件尾尾。
指指示示器器随随读读写写操操作作自自动动后后移移,,指向下次操作位置指向下次操作位置为为方方便便,,标标准准库库提提供供了了直直接接操操作作文文件件指指示示器器的的函函数数::文文件定位函数件定位函数/指示器移动函数最常用的三个:指示器移动函数最常用的三个:void rewind(FILE *st)将流将流st的文件指示器重设到文件开始位置的文件指示器重设到文件开始位置long ftell(FILE *st)返回流返回流st当时指示器位置出错返回当时指示器位置出错返回-1L2教育int fseek(FILE *st, long offset, int origin)设设置置流流st的的指指示示器器,,使使随随后后IO操操作作在在新新位位置置进进行行origin指定定位基准点,可能取值:指定定位基准点,可能取值:SEEK_SET 以文件头作为定位的基准点以文件头作为定位的基准点SEEK_CUR 以指示器的当前位置作为基准点以指示器的当前位置作为基准点SEEK_END 以文件尾作为基准点以文件尾作为基准点正正文文流流的的移移动动操操作作有有限限制制对对二二进进制制流流没没限限制制,,移移动动目目标是以标是以origin为基准点偏移为基准点偏移offset的位置。
的位置3教育出错处理出错处理输出出错信息是希望显示到屏幕供人读通过输出出错信息是希望显示到屏幕供人读通过stdout不合适:输出定向到文件也使出错信息送到文件不合适:输出定向到文件也使出错信息送到文件送送到到标标准准错错误误流流stderr的的信信息息不不受受定定向向影影响响改改造造前前面程序面程序cat,只需要改动一个语句:,只需要改动一个语句:fprintf(stderr,"%s, can't open in file: %s\n", name, *argv);• 文件错误检查:文件错误检查:int ferror(FILE *stream)IO出出错错时时设设置置相相关关流流的的出出错错标标志志变变量量ferror检检查查流流的出错标志当的出错标志当stream的状态变量设置时返回非的状态变量设置时返回非0• 错误标志复位(清除)函数错误标志复位(清除)函数 void clearerr(FILE *stream)4教育标准库错误处理:标准库错误处理:为检查程序执行中出错,库提供了一些机制为检查程序执行中出错,库提供了一些机制每每个个C系系统统定定义义了了一一组组错错误误编编号号,,0表表示示无无错错,,其其余余值值表示各种错误。
表示各种错误一一些些函函数数出出错错时时自自动动给给状状态态变变量量errno设设错错误误编编号号,,还还定义了相应的信息串见定义了相应的信息串见
其其中中列列出出库库函函数数原原型型,,所所用用类类型型((如如FILE))、、符符号号常常量量((如如EOF、、NULL))和和其他宏定义等其他宏定义等6教育在在C程序里用标准库函数,只需包含有关的头文程序里用标准库函数,只需包含有关的头文件,这将保证程序对标准库函数的使用与其实际件,这将保证程序对标准库函数的使用与其实际定义间的一致性定义间的一致性库代码文件通常很大,具体程序实际使用的库功库代码文件通常很大,具体程序实际使用的库功能通常只是其中很少一部分能通常只是其中很少一部分人们开发了这样的技术,在程序连接时不是把库人们开发了这样的技术,在程序连接时不是把库代码文件整个装配到可执行文件里,而是根据实代码文件整个装配到可执行文件里,而是根据实际需要,由库文件里提取出必要部分装配进程序际需要,由库文件里提取出必要部分装配进程序里,以保证用户程序的紧凑性里,以保证用户程序的紧凑性7教育9.5.1 几个已经介绍过的头文件几个已经介绍过的头文件
cs表示表示const char*((const字符串),字符串),s表表示示char*(字符数组),用(字符数组),用c表示字符表示字符8教育char* strpbrk(cs1, cs2);查寻查寻cs2中的字符在中的字符在cs1里第一次出现的位置里第一次出现的位置char* strstr(cs1, cs2);查寻查寻cs2(子串)在(子串)在cs1中出现的中出现的位置成功时位置成功时返回所确定位置的指针,失败返回空指针返回所确定位置的指针,失败返回空指针size_t strspn(cs1, cs2);cs1的所有字符都属于的所有字符都属于cs2的的前缀的长度前缀的长度;;size_t strcspn(cs1, cs2);cs1的所有字符都不属于的所有字符都不属于cs2的前缀的长度的前缀的长度前缀前缀”:字符串开始的一段字符串开始的一段9教育char* strtok(s,ct);是个比较复杂的函数其基本功能是用于在字符是个比较复杂的函数其基本功能是用于在字符数组数组s中标识出一段段字符,字符段之间原来由中标识出一段段字符,字符段之间原来由ct里的字符分隔(里的字符分隔(ct是分隔字符的数组)。
是分隔字符的数组)另有一组存储块操作函数:复制另有一组存储块操作函数:复制memcpy、移动、移动(允许重叠)(允许重叠)memmove、比较、比较memcmp、位置查、位置查找找memchr、设置、设置memset10教育9.5.2 一些功能函数一些功能函数,,
执行控制几个有关程序执行结束的函数:几个有关程序执行结束的函数:void abort(void) 程序立即非正常终止程序立即非正常终止void exit(int stat) 程程序序立立即即正正常常终终止止,,stat为为程程序序出出口口值值,,0表表示示成成功功结结束束另另可可用用常常数数::EXIT_SUCCESS、、EXIT_FAILURE程程序序结结束束前前关关闭闭所所有有文文件件可可要要求求程程序序结结束束前前做做些些动动作,通过函数作,通过函数atexit登记:登记:int atexit(void (*fcn)(void))把把函函数数fcn登登记记为为结结束束动动作作,,可可多多次次登登记记fcn应应是是无无参参无无返返回回值值的的函函数数atexit在在登登记记正正常常返回值返回值0,否则返回非零值否则返回非零值13教育与执行环境交互与执行环境交互int system(const char *s)把把串串s传传给给程程序序环环境境,,要要求求将将它它作作为为系系统统命命令令执执行行用用NULL调调用用函函数数返返回回非非0值值表表示示环环境境里里有有命命令令解解释释器器((可可以以用用这这个个方方式式检检查查命命令令解解释释器器的的存存在)。
在)s非非NULL时返回值由实现确定时返回值由实现确定char *getenv(const char *s)取取回回与与串串s相相关关的的环环境境串串找找不不到到时时返返回回NULL函函数数执执行行结结果果由由实实现现确确定定在在许许多多执执行行环环境境里里可可以用这个函数查看环境变量的值以用这个函数查看环境变量的值14教育bsearch在一批数据里查找某个项:在一批数据里查找某个项:void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum) )cmp应应与与strcmp类类似似,,在在数数keyval与与datum相相比更大比更大/相等相等/更小时分别返回正更小时分别返回正/零零/负值负值设设数数组组base[0]..base[n-1]元元素素按按cmp序序上上升升排排列列,,元元素素大大小小为为sizebsearch以以*key为为比比较较依依据据在在数数组组里里查查找找匹匹配配元元素素((使使cmp值值等等于于0的的元元素素)),,返返回回指指向向该该元元素素的的指指针针。
找找不不到到时时返回返回NULL15教育qsort用于把一组数据按指定顺序排列:用于把一组数据按指定顺序排列:void qsort(void *bs, size_t n, size_t size, int (*cmp)(const void *, const void *))cmp与与bsearch的要求一样的要求一样设设bs[0], ..., bs[n-1]元元素素大大小小为为size,,qsort把把bs元素按照上升顺序重排元素按照上升顺序重排16教育函数函数bsearch和和qsort使用的一个例子:使用的一个例子:int *p, k = 7;int a[] = {5, 6, 3, 28, 23, 34, 7, 9, 6, 14};int icmp (const void *p, const void *q) { int *m =(int*)p, *n =(int*)q; return *n>*m ? 1 : (*n==*m ? 0 : -1);}17教育int main () { ... ... qsort(a, NTERMS(a), sizeof(int), icmp); /* a的元素已按上升顺序排列的元素已按上升顺序排列 */ p = bsearch(&k, a, NTERMS(a), sizeof(int), icmp); /* 指针指针p将指向数组将指向数组a中元素中元素7的位置的位置 */ ... … return 0;}18教育9.5.3 关于日期和时间的函数关于日期和时间的函数,,
定义了几个时间类型,说明了许多函数time_t和和clock_t是表示时间的数值类型:是表示时间的数值类型:clock_t表示计时表示计时时间;时间;time_t表示某种日历时间,从历史的某时刻开表示某种日历时间,从历史的某时刻开始计算定义了时间结构始计算定义了时间结构struct tm,成分:,成分:int tm_sec;剩余秒数(剩余秒数(0~~61))int tm_min;剩剩余分钟数(余分钟数(0~~59))int tm_hour;剩剩余小时数(余小时数(0~~23))int tm_mday;月月中日数(中日数(1~~31))int tm_mon;年年中月数(中月数(1~~12))int tm_year;1900后的年序数后的年序数int tm_wday;星星期中日序数(期中日序数(0~~6))int tm_isday;夏夏季时标志季时标志int tm_yday;年年中日序数(中日序数(0~~365))19教育。












