《C程序设计语言》笔记 (十五) 参考手册7
标准库
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");