标准库
ANSI定义的标准函数库
标准库不是C语言本身的构成部分
但是支持标准C的实现会提供该函数库中的函数声明、类型以及宏定义
标准库中的函数 类型以及宏分别在下面的标准头文件中定义:
<assert.h>
<ctype.h>
<errno.h>
<float.h>
<limits.h>
<locale.h>
<math.h>
<setjmp.h>
<signal.h>
<stdarg.h>
<stddef.h>
<stdio.h>
<stdlib.h>
<string.h>
<time.h>
可以通过下列方式访问头文件
#include <头文件>
头文件的包含顺序是任意的,并可以包含任意多次
头文件必须包含在任何外部声明或定义之外
必须在使用头文件中的任意声明之前包含头文件
头文件不一定是源文件
以下划线开头的外部标识符保留给标准库使用
输入输出<stdio.h>
头文件<stdio.h>中定义的输入输出函数、类型以及宏的数目几乎占整个标准库的三分之一
流是与磁盘或其他外围设备关联的数据的源或目的地
尽管在某些系统中(如UNIX),文本流和二进制流是相同的,但标准库任然提供了这两种类型的流
文本流是由文本行组成的序列,每一行包含0个或多个字符并以'\n'结尾
二进制流是由未经处理的字节构成的序列,这些字节记录着内部数据
如果在同一系统中写入二进制流,然后再读取二进制流,则读出和写入的内容完全相同
打开一个流,将把该流和一个文件或设备连接起来,关闭流将断开连接
打开一个文件将返回一个指向FILE类型的对象的指针,该指针记录了控制该流的所有必要信息
程序开始执行时,stdin stdout 和stderr这3个流已经处于打开状态
文件操作
FILE *fopen(const char *filename,const char *mode);
fopen函数打开filename指定的文件,并返回一个与之关联的流
如果打开失败,则返回NULL
访问模式:
"r" 读
"w" 写,并删除已存在的内容
"a" 追加
"r+" 打开文本文件用于更新
"w+" 创建文本用于更新
"a+" 打开或创建文件用于更新,写文件时追加到文件末尾
FILE *freopen(const char *filename,const char *mode,FILE *stream);
以mode指定的模式打开filename指定的文件,并将该文件关联到stream指定的流
成功返回stream,出错返回NULL
freopen 函数一般用于改变与stdin stdout stderr相关联的文件
int fflush(FILE *stream);
对输出流来说,fflush函数将已写到缓冲区但尚未写入文件的所有数据写入文件
对输入流来说,其结果是未定义的
如果在写的过程中方式错误,则返回EOF 否则返回0
fflush(NULL) 将清洗所有的输出流
int flose(FILE *stream);
将所有未写入的数据写入stream中,丢弃缓冲区的所有未读输入数据,释放自动分配的全部缓冲区,最后关闭流
若出错返回EOF,否则返回0
int remove(const char *filename);
删除指定的文件,如果删除失败,返回一个非0值.
int rename(const char *oldname,const char *newname);
修改文件名,失败返回非0;
FILE *tmpfile(void);
tmpfile函数以模式"wb+"创建一个临时文件,该文件在被关闭或程序正常结束时自动删除
char *tmenam(char s[L_tmpname]);
tmpnam(NULL) 函数创建一个与现有文件名不同的字符串,并返回一个指向一内部静态数组的指针
int setvbuf(FILE *stream,char *buf,int mode, size_t size);
setvbuf函数控制流stream的缓冲.
在执行读写以及其他任何操作之前必须调用此函数
void setbuf(FILE *stream,char *buf);
如果buf值为NULL,则关闭stream的缓冲
格式化输出
printf函数提供格式化输出转换
int fprintf(FILE *stream,const char *format,...);
fprintf函数按照format说明的格式对输出进行转换,并写到stream中。
返回实际写入的字符数,错误返回负值
int sprintf(char *s,const char *format,...);
sprintf函数和printf函数基本相同,但其输出将被写入到字符串 s中,并以'\0'结束
vprintf
vfprintf
vsprintf
函数分别对应printf的函数等价
格式化输入
scanf函数处理格式化输入转换
int fscanf(FILE *stream,const char *format,...);
fscanf函数根据格式字符串format从流stream中读取输入,并把转换后的值赋值给后续参数,其中每个参数必须是一个指针
int sscanf(const char *s,const char *format,...);
sscanf函数scanf等价,所不同的是,前者的输入字符来源于字符串s
字符输入/输出函数
int fgetc(FILE *stream);
函数返回stream流的下一个字符,返回类型unsigned char
如果达到文件末尾或发生错误,返回EOF
char *fgets(char *s,int n,FILE *stream);
fgets 函数最多将n-1个字符读入到数组s中
当遇到换行符时,把换行符读入到数组s中,读取过程终止
数组以'\0'结尾
到达文件尾或发生错误,返回EOF
int fputc(int c,FILE *stream);
fputc函数把字符c输出到stream中
返回写入的字符,出错返回EOF
int fputs(const char *s,FILE *stream);
fputs函数把字符串s输出到stream中,出错返回EOF
int getc(FILE *stream);
getc函数等价于fgetc,所不同的是,当getc函数定义为宏时,它可能多次计算stream的值
int getchar(void);
等价于getc(stdin);
char *gets(char *s);
把下一个输入行读入的数组中
int putc(int c ,FILE *stream);
int putchar(int c);
等价于 putc(c,stdout);
int puts(const char *s);
int ungetc(int c,FILE *stream);
直接输入/输出函数
size_t fread(void *ptr,size_t size,size_t nobj,FILE *stream);
size_t fwrite(const void *ptr,size_t size,size_t nobj,FILE *stream);
文件定位函数
int fseek(FILE *stream,long offset,int origin);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream,fpos_t *ptr);
int fsetpos(FILE *stream,const fpos_t *ptr);
错误处理函数
当发生错误或到达文件末尾时,标准库中的许多函数都会设置状态指示符
这些状态指示符可被显式的设置和测试
另外,整型表达式errno可以包含一个错误编号,据此可以进一步了解最近一次出错信息
void clearerr(FILE *stream);
clearerr函数清除与流stream相关的文件结束符合错误指示符
int feof(FILE *stream);
如果设置了与stream流相关的文件结束符,feof函数将返回非0值
int ferror(FILE *stream);
void perror(const char *s);
fprintf(stderr,"%s,:%s\n",s"error message");