《C语言知识学习标准规定库19.ppt》由会员分享,可在线阅读,更多相关《C语言知识学习标准规定库19.ppt(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1,几个有关函数 标准库还提供了另外一些与IO有关的函数。 1)缓冲区冲刷函数fflush。原型: int fflush(FILE *stream) 对输出流有定义。要求立即将缓冲区数据写入文件。本操作对输入流的作用在标准里没有定义。正常完成返回0,出错返回EOF。 2)文件结束判断函数feof。其原型是: int feof(FILE *stream) 判断是否到达文件末尾。主要用于二进制文件,遇到文件结束时返回非0值。,2,3)文件定位及定位函数 文件可看作字节的序列,每个字节在序列中有一位置。可认为IO时有一个文件位置指示器。 以读/写方式打开时指示器设在文件开头,以附加方式打开指示器设在
2、文件尾。指示器随读写操作自动后移,指向下次操作位置。 为方便,标准库提供了直接操作文件指示器的函数:文件定位函数/指示器移动函数。最常用的三个:,void rewind(FILE *st) 将流st的文件指示器重设到文件开始位置。 long ftell(FILE *st) 返回流st当时指示器位置。出错返回-1L。,3,int fseek(FILE *st, long offset, int origin) 设置流st的指示器,使随后IO操作在新位置进行。origin指定定位基准点,可能取值: SEEK_SET 以文件头作为定位的基准点 SEEK_CUR 以指示器的当前位置作为基准点 SEEK
3、_END 以文件尾作为基准点 正文流的移动操作有限制。对二进制流没限制,移动目标是以origin为基准点偏移offset的位置。,4,出错处理 输出出错信息是希望显示到屏幕供人读。通过stdout不合适:输出定向到文件也使出错信息送到文件。 送到标准错误流stderr的信息不受定向影响。改造前面程序cat,只需要改动一个语句: fprintf(stderr,%s, cant open in file: %sn, name, *argv);,文件错误检查:int ferror(FILE *stream) IO出错时设置相关流的出错标志变量。ferror检查流的出错标志。当stream的状态变量设
4、置时返回非0。 错误标志复位(清除)函数 void clearerr(FILE *stream),5,标准库错误处理: 为检查程序执行中出错,库提供了一些机制。 每个C系统定义了一组错误编号,0表示无错,其余值表示各种错误。 一些函数出错时自动给状态变量errno设错误编号,还定义了相应的信息串。见。 打印当时错误信息: void perror(char *s) 检查当时错误编号(perror调用之前的最近错误),把对应信息串送到stderr。输出形式: 字符串s 冒号 错误信息串 换行,6,9.5 标准库介绍,标准库由一组库代码文件和一组头文件组成。 代码文件内是标准函数的程序代码及相关数据
5、(变量)。若程序调用标准函数,连接程序将从库代码文件提取函数代码,将其拼接到结果程序里,并完成调用连接。库代码文件里还附带了一些连接程序使用的信息。 ANSI C的标准头文件是一组正文文件,提供库函数的使用信息。其中列出库函数原型,所用类型(如FILE)、符号常量(如EOF、NULL)和其他宏定义等。,7,在C程序里用标准库函数,只需包含有关的头文件,这将保证程序对标准库函数的使用与其实际定义间的一致性。 库代码文件通常很大,具体程序实际使用的库功能通常只是其中很少一部分。 人们开发了这样的技术,在程序连接时不是把库代码文件整个装配到可执行文件里,而是根据实际需要,由库文件里提取出必要部分装配
6、进程序里,以保证用户程序的紧凑性。,8,9.5.1 几个已经介绍过的头文件 字符串函数(): char* strchr(cs, c); char* strrchr(cs, c); 查寻字符c在字符串cs里出现的位置(第一个,或者最后一个)。 cs表示const char*(const字符串),s表示char*(字符数组),用c表示字符。,9,char* strpbrk(cs1, cs2); 查寻cs2中的字符在cs1里第一次出现的位置。 char* strstr(cs1, cs2); 查寻cs2(子串)在cs1中出现的位置。成功时返回所确定位置的指针,失败返回空指针。 size_t strsp
7、n(cs1, cs2); cs1的所有字符都属于cs2的前缀的长度; size_t strcspn(cs1, cs2); cs1的所有字符都不属于cs2的前缀的长度。 “前缀”:字符串开始的一段。,10,char* strtok(s,ct); 是个比较复杂的函数。其基本功能是用于在字符数组s中标识出一段段字符,字符段之间原来由ct里的字符分隔(ct是分隔字符的数组)。 另有一组存储块操作函数:复制memcpy、移动(允许重叠)memmove、比较memcmp、位置查找memchr、设置memset。,11,9.5.2 一些功能函数, 随机数生成和动态存储分配函数已介绍。 几个整数函数 int
8、abs(int n)求整数绝对值 long labs(long n)求长整数绝对值 div_t div(int n, int m) ldiv_t ldiv(long n, long m) 将n/m的商和余数存入结果结构的对应成员 div_t和ldiv_t是预定义结构类型,的成分是int或者long的的quot和rem。,12,数值转换 从数字字符串构造各种数值类型的值: double atof(const char *s) 由串s构造一个双精度值 int atoi(const char *s) 由串s构造一个整数值 long atol(const char *s) 由串s构造一个长整数值,13
9、,执行控制。几个有关程序执行结束的函数: void abort(void) 程序立即非正常终止。 void exit(int stat) 程序立即正常终止,stat为程序出口值,0表示成功结束。另可用常数:EXIT_SUCCESS、EXIT_FAILURE。程序结束前关闭所有文件。可要求程序结束前做些动作,通过函数atexit登记: int atexit(void (*fcn)(void) 把函数fcn登记为结束动作,可多次登记。fcn应是无参无返回值的函数。atexit在登记正常返回值0,否则返回非零值。,14,与执行环境交互 int system(const char *s) 把串s传给程
10、序环境,要求将它作为系统命令执行。用NULL调用函数返回非0值表示环境里有命令解释器(可以用这个方式检查命令解释器的存在)。s非NULL时返回值由实现确定。 char *getenv(const char *s) 取回与串s相关的环境串。找不到时返回NULL。函数执行结果由实现确定。在许多执行环境里可以用这个函数查看环境变量的值。,15,bsearch在一批数据里查找某个项: void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const v
11、oid *datum) ) cmp应与strcmp类似,在数keyval与datum相比更大/相等/更小时分别返回正/零/负值。 设数组base0.basen-1元素按cmp序上升排列,元素大小为size。bsearch以*key为比较依据在数组里查找匹配元素(使cmp值等于0的元素),返回指向该元素的指针。找不到时返回NULL。,16,qsort用于把一组数据按指定顺序排列: void qsort(void *bs, size_t n, size_t size, int (*cmp)(const void *, const void *) cmp与bsearch的要求一样。 设bs0, .,
12、 bsn-1元素大小为size,qsort把bs元素按照上升顺序重排。,17,函数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); ,18,int main () . . qsort(a, NTERMS(a), sizeof(int), icmp); /* a的元素已按上升顺序排
13、列 */ p = bsearch( ,19,9.5.3 关于日期和时间的函数, 定义了几个时间类型,说明了许多函数。time_t和clock_t是表示时间的数值类型:clock_t表示计时时间;time_t表示某种日历时间,从历史的某时刻开始计算。定义了时间结构struct tm,成分: int tm_sec;剩余秒数(061) int tm_min;剩余分钟数(059) int tm_hour;剩余小时数(023) int tm_mday;月中日数(131) int tm_mon;年中月数(112) int tm_year;1900后的年序数 int tm_wday;星期中日序数(06) int tm_isday;夏季时标志 int tm_yday;年中日序数(0365),