原文: 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
标准输出流
其中
stderr
、
stdin
、
stdout
为宏定义,是指向
FILE
类型的指针。
中的函数有很多,大致可分为对标准输入输出流的操作、对文件流的操作、对标准错误流的操作、对字符串的操作这几大类。
标准输入输出流
其实从
stdin
与
stdout
的定义中也可以看到,标准输入输出流也就是文件,只是一般情况下已经默认定义为键盘和屏幕。这与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_SET
、
SEEK_END
或
SEEK_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