C语言标准库

2019-07-13 03:44发布

原文: http://gaomingfei.xyz/2016/04/18/C语言标准库总结/  作者: 高明飞 标准库(Standard Library)是C语言重要的一部分,不过学习C语言这么长时间,都没有细致的了解过标准库到底中包含哪些内容,这几天打算来仔细看看这部分内容。 C语言标准库有各种不同的实现,比如最著名的glibc, 用于嵌入式Linux的uClibc,还有ARM公司的自己的C语言标准库及精简版的MicroLib等。不同标准库的实现并不相同,而且提供的函数也不完全相同,不过有一个它们都支持的最小子集,这也就是最典型的C语言标准库。 这个C语言标准库中一共包含15个头文件,粗略的按常用程度排序列举如下: Header File Content 输入和输出 最常用的一些系统函数 字符串处理 数学函数 字符类测试 时间和日期 可变参数列表 信号 断言 非局部跳转 定义错误代码 一些常数、类型和变量 本土化 浮点数运算 定义整数数据类型的取值范围 在这里不准备列举所有库函数的详细用法,如需查询具体的库函数用法,可以参考以下几个链接:
Standard C 语言标准函数库速查 (Cheat Sheet)
C标准库参考手册
C Standard Library Reference Tutorial
本文总结的是不完整的C标准库,仅列举一些常用且最重要的部分。 关于C标准库本身的实现分析,可参考我的学习笔记:
C标准库学习笔记(1)——time、ctype、stdarg、assert

stdio.h

输入和输出。 在其中定义了以下一些常用的类型及常量: Name Comment FILE 文件指针 EOF End Of File,表示文件的结尾 stderr 标准错误流 stdin 标准输入流 stdout 标准输出流 其中stderrstdinstdout为宏定义,是指向FILE类型的指针。 中的函数有很多,大致可分为对标准输入输出流的操作、对文件流的操作、对标准错误流的操作、对字符串的操作这几大类。

标准输入输出流

其实从stdinstdout的定义中也可以看到,标准输入输出流也就是文件,只是一般情况下已经默认定义为键盘和屏幕。这与Linux中一切皆文件的思想一脉相承。 常用的函数有以下这些: Name Comment int printf(const char * format, ...) 格式化输出数据至stdout int scanf(const char * format, ...)stdin读取格式化输入数据 int putchar(int c)stdout输出一个字符 int getchar(void)stdin读入一个字符 int puts(const char * s)stdout输出一串字符串 char * gets(char * s)stdin读入一串字符串 另外,vprintf()函数主要用于需要自己实现一些类似printf()的函数时使用,关于这个函数的用处可参考StackOverflow上的讨论,用于文件流的vfprintf()与用于字符串的vsprintf()的用处也是相似的。

文件流

对文件的操作是中的核心,其他函数均可视为对特定文件的操作,大部分函数均以f****()命名。 最重要的函数是以下这几个: Name Comment FILE * fopen(const char * filename, const char * mode) 打开文件,失败返回NULL int fclose(FILE * stream) 关闭文件,成功返回0,失败返回EOF size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream) 读取文件内容 size_t fwrite(cosnt void * ptr, size_t size, size_t nmemb, FILE * stream) 写入文件内容 只使用这4个函数就可以完成基本的文件读写操作了,其它函数可以视为是为了更方便的进行文件读写而引入的。在Linux中,文件不仅仅是指磁盘上的一个file,也有可能是一个设备等,不过都可以以统一的方式进行读写。常用的打开模式有r(读)、w(写)、a(附加)、b(二进制)等。
与标准输入输出流的操作相同,对文件的操作也有以下这些函数: Name Comment int fprintf(FILE * stream, const char * format, ...) 格式化输出数据至文件 int fscanf(FILE * stream, cosnt char * format, ...) 由文件读取格式化输入数据 int putc(int c, FILE * stream) 向文件输出一个字符 int getc(FILE * stream) 由文件读入一个字符 int fputc(int c, FILE * stream) 向文件输出一个字符 int fgetc(FILE * stream) 由文件读入一个字符 int fputs(const char * s, FILE * stream) 向文件输出一串字符串(或比特流) char * fgets(char * s, int n, FILE * stream) 由文件读入一串字符串(或比特流) 其中putc()fputc()getc()fgetc()的区别在于前者可能是使用宏定义实现的,而后者一定是函数,具体分析可以参考这篇文章
用于对文件进行修改(如删除文件等)的函数有以下这些: Name Comment int remove(const char * filename) 删除文件,成功返回0 int rename(const char * old, const char * new) 更改文件名称或位置,成功返回0 FILE * tmpfile(void) 以wb+形式创建一个临时二进制文件 其中tmpfile()创建的临时文件在调用fclose()关闭时会被自动删除。
对文件流的定位通常使用以下这些函数: Name Comment int fseek(FILE * stream, long int offset, int fromwhere) 移动文件流的读写位置,错误返回非0 long int ftell(FILE * stream) 取得文件流的读取位置 void rewind(FILE * stream) 重设读取目录的位置为开头位置 int feof(FILE * stream) 检测文件结束符 whence可设置为SEEK_SETSEEK_ENDSEEK_CUR
使用这两个函数处理读写文件流操作中的错误: Name Comment int ferror(FILE * stream) 检查流是否有错误 void clearerr(FILE * stream) 复位错误标志
与缓冲(Buffer)机制有关的函数常用的有以下这两个: Name Comment void setbuf(FILE * stream, char * buf) 把缓冲区与流相联 int fflush(FILE * stream) 更新缓冲区,成功返回0,错误返回EOF

其他流操作

stderr的操作通过以下函数完成: Name Comment void perror(const char * s) 打印出错误原因信息字符串 此函数将上一个函数发生错误的原因输出到stderr,此错误原因依照全局变量errno的值来决定要输出的字符串,errno中声明。
对字符串也提供了格式化输入输出函数: Name Comment int sprintf(char * s, const char * format, ...) 格式化字符串复制 int sscanf(const char * s, const char * format, ...) 格式化字符串输入

stdlib.h

最常用的一些系统函数。 在其中定义了以下一些常用的类型及常量: Name Comment size_t

热门文章