标准函数库
# 1 输入/输出函数
# 1.1 错误报告
#include <stdio.h>
// perror函数简化向用户报告这些特定错误的过程。
void perror(char const *message);
# 1.2 终止执行
#include <stdlib.h>
void exit(int status); // EXIT_SUCCESS EXIT_FAILURE
# 1.3 流I/O
关于文件I/O:
- 程序为必须同时处于活动状态的每个文件声明一个指针变量,其类型是FILE *。这个指针指向这个FILE结构。当它处于活动状态时由流使用。
- 流通过调用fopen函数打开。fopen和操作系统验证文件或设备确实存在并初始化FILE结构。
- 然后,根据需要对文件进行读取或写入。
- 最后,调用fclose函数关闭流。关闭流可以防止与它关联的文件被再次访问,保证任何存储与缓冲区的数据被正确地写到文件中,并且释放FILE结构使它可以用于另外的文件。
- 标准流I/O更为简单,不需要打开或关闭。标准流的I/O函数以三种形式处理数据:单个字符、文本行和二进制数据。
数据类型 | 输入 | 输出 | 描述 |
---|---|---|---|
字符 | getchar | putchar | 读取(写入)单个字符 |
文本行 | gets scanf | puts printf | 文本行未格式化的输入(输出) 格式化的输入(输出) |
二进制数据 | fread | fwrite | 读取(写入)二进制数据 |
EOF——到达了文件尾
# 1.4 打开流
FILR *fopen(char const *name, char const *mode);
读取 | 写入 | 添加 | |
---|---|---|---|
文本 | “r” | “w” | “a” |
二进制 | “rb” | “wb” | “ab” |
# 1.5 关闭流
int flose(FILE *f);
// 如果执行成功,返回零,否则返回EOF
# 1.6 字符 I/O
// 输入
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void ); //ch = getchar();
// 输出
int fputc(int character, FILE *stream);
int getc(int character, FILE *stream);
int getchar(int character);
# 1.7 未格式化的行I/O
char *fgets(char *buffer, int buffer_size, FILE *stream);
char *gets(char *buffer);
char *fputs(char const *buffer, FILE *stream);
char *gets(char const *buffer);
# 1.8 格式化的行I/O
int fscanf(FILE *stream, char const *format, ...);
int scanf(char const *format, ...);
int sscanf(char const *string, char const *format, ...);
int fprintf(FILE *stream, char const *format, ..);
int printf(char const *format, ...);
int sprintf(char const *buffer, char const *format, ...);
scanf存在缓冲:通过scanf由键盘输入内容时,并不是直接赋值给变量,而是送给缓冲,缓冲可以接受从键盘输入的很多内容。当执行到scanf时,scanf就会从缓冲内读取数据,(那么问题来了)scanf怎么知道读到哪结束?那就需要空白符(空白符:指空格符、制表符、回车符)来控制了 ;当scanf读到空白符时,就停止读取,将空白符前面的内容赋值给scanf中的变量。
当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。
scanf("%s\n", buf);
\n是空白符,当从键盘输入时要按照该格式输入;用\n过滤scanf结束时的回车,缓冲区的\n不会对后续输入造成影响,反而会导致需要额外输入一个非空白字符作为结束,所以scanf不要以\n作为结束。
# 1.9 二进制I/O
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
size_t fwrite(void *buffer, size_t size, size_t count, FILE *stream);
# 1.10 刷新和定位函数
int fflush(FILE *stream);
void rewind(FILE *stream); // 将读写指针设置回起始位置
long ftell(FILE *stream);
int fseek(FILE *stream, long offset, int from);
如果form是... | 你将定位到... |
---|---|
SEEK_SET | 起始位置 |
SEEK_CUR | |
SEEK_END | 末尾 |
// fseek函数与ftell函数综合应用:可以用fseek函数把位置指针移到文件尾,再用ftell函数获得这时位置指针距文件头的字节数,这个字节数就是文件的长度.
#include <stdio.h>
int main()
{
FILE *fp;
char filename[80] = "xxxxxxx";
long length;
//以二进制读文件方式打开文件
fp=fopen(filename,"rb");
if(fp==NULL)
printf("file not found!/n");
else
{
//把文件的位置指针移到文件尾
fseek(fp,OL,SEEK_END);
//获取文件长度;
length=ftell(fp);
printf("该文件的长度为%1d字节/n",length);
fclose(fp);
}
}
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *fp;
long int size;
char *buff;
if((fp=fopen("w.dat","rb")) == NULL)
{
printf("cannot open file/n");
exit(1);
}
fseek(fp,0,SEEK_END);
size=ftell(fp);
buff=(char *)malloc(size);
fseek(fp,0,SEEK_SET);
if(fread(buff,1,size,fp) != size)
{
printf("read error!!");
}
free(buff);
buff = NULL;
}
# 2 整型函数
#include <stdlib.h>
// 算术
int abs(int value);
div_t div(int numerator, int denominator);
// 随机数
int rand(void);
void srand(unsigned int seed);
srand((unsigned int)time(0)); // 使用时间作为随机数产生器的种子
// 字符串转换
int atoi(char const *string);
long int atol(char const *string);
# 3 日期和时间函数
#include <time.h>
clock_t clock(void);// 程序开始执行起处理器所消耗的时间
time_t time(time_t *returned_value);
strunct tm *localtime(time_t const *time_value);
# 4 查找
// 对数组以升序的方式进行排序
void qsort(void *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const *));
// 第1个参数指向需要排序的数组
// 第2个参数指定数组中元素的数目
// 第3个参数指定每个元素的长度
// 第4个参数是一个函数指针,用于对需要排序的元素类型进行比较
# 5 排序
// bsearch函数:在一个已经排好序的数组中用二分法查找一个特定的元素
void *bsearch(void const *key, void const *base, size_t n_elements, size_t el_size, int (*compare)(void const *, void const *));
// 第1个参数指向你需要查找的值
// 第2个参数指向查找所在的数组
// 第3个参数指定数组中元素的数目
// 第4个参数每个元素的长度
// 第5个参数是一个函数指针