目录
什么是标准IO?
在C库中定义的一组专门用于输入输出的函数,也就是存在于函数包或者“stdio.h”里面定义的,可移植性强
特点
1.通过缓冲机制减少系统调用,提高效率(至于什么是缓冲机制,会在下面进行补充)
2.围绕流进行操作,流用FILE *来描述
3. 标准IO默认打开了三个流,stdin(标准输入)、stdout(标准输出)、stderr(标准错误)
4.一般只操作普通文件
什么是缓冲机制
看上图,我们首先需要了解,如果没有缓冲区,假如我们应用层需要和硬件进行交互,假如需要取1000个数据,而我们每次最多拿10个数据,我们需要拿一百次,也就是调用100次接口。而有了缓冲区,我们可以一次拿1000个数据,只需要调用一次接口,应用层只需要从缓冲区拿数据即可。
缓冲区,正是应用层进行系统调用之前,封装的一块区域
什么是流
我在这里,只能用我自己的方法对流进行解释说明,便于理解:
流是一个抽象的概念,当程序读取数据时,就会开启一个通往数据源的流,这个数据源可以是文件、内存或者是网络链接;当程序写入数据时,就会开启一个通往目的地的流。
也可以把计算机之间的数据传输想象成河流,一个个二进制就是水,不停的在流淌。
缓冲机制
缓冲可以分成行缓冲和全缓冲,还有不缓冲
全缓冲
全缓冲和文件相关
刷新缓冲条件:
1.程序正常结束:return(main)、exit
2.缓冲区满刷新
3.fclose关闭对应的流
4.强制刷新:fflush
行缓冲
行缓冲:跟终端相关
刷新缓冲条件:
1 \n
2 程序正常结束:return(main)、exit
3 缓冲区满刷新
4 fclose关闭对应的流
5 强制刷新:fflush
注意:当遇到阻塞输入函数时,输出缓存区会刷新
比如:scanf
不缓冲
不缓冲:没有缓冲区,标准错误
关于标准IO的函数接口
对文件操作
打开文件
FILE *fopen(const char *path, const char *mode)
功能:打开文件
参数:
path:打开的文件
mode:打开的方式
r:只读,当文件不存在时报错,文件流定位到文件开头
r+:可读可写,当文件不存在时报错,文件流定位到文件开头
w:只写,文件不存在创建,存在清空
w+:可读可写,文件不存在创建,存在清空
a:追加(在末尾写),文件不存在创建,存在追加,文件流定位到文件末尾
a+:读和追加,文件不存在创建,存在追加,读文件流定位到文件开头,写文件流定位到文件末尾
注:当a的方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置
返回值:成功:文件流
失败:NULL,并且会设置错误码
FILE *freopen(const char *pathname, const char *mode, FILE* fp)
功能:将指定的文件流重定向到打开的文件中
参数:path:文件路径
mode:打开文件的方式(同fopen)
fp:文件流指针
返回值:成功:返回文件流指针
失败:NULL
关闭文件
int fclose(FILE* stream);
功能:关闭文件
参数:stream:文件流
读写操作
//每次读写一个字符int fgetc(FILE * stream)
功能:从文件中读取一个字符
参数:stream:文件流
返回值:成功:读到的字符
失败或读到文件末尾:EOF(-1)
int fputc(int c, FILE * stream)
功能:向文件中写入一个字符
参数:c:要写的字符
stream:文件流
返回值:成功:写的字符的ASCII
失败:EOF
//每次读写一串内容char * fgets(char *s, int size, FILE * stream);
功能:从文件中每次读取一行字符串
参数:s:存放字符串的地址
size:一次读取的字符个数
stream:文件流
返回值:成功:s的地址
失败或读到文件末尾:NULL
特性:每次实际读取的字符个数为size-1个,会在末尾自动添加\0
每次读一行,遇到\n后不再继续,读下一行
int fputs(const char *s, FILE * stream);
功能:向文件中写字符串
参数:s:要写的内容
stream:文件流
返回值:成功:非负整数
失败:EOF
//二进制读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件流读取多个元素
参数: ptr :用来存放读取元素
size :元素大小 sizeof(数据类型)
nmemb :读取元素的个数
stream :要读取的文件
返回值:成功:读取的元素的个数;
读到文件尾: 0
失败: -1
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:按对象写
参数:同上
返回值:成功:写的元素个数
失败 :-1
定位操作
int feof(FILE * stream);
功能:判断文件有没有到结尾
返回:到达文件末尾,返回非零值
int ferror(FILE * stream);
功能:检测文件有没有出错
返回:文件出错,返回非零值
void rewind(FILE *stream);
功能:将文件位置指针定位到起始位置
int fseek(FILE *stream, long offset, int whence);
功能:文件的定位操作
参数:stream:文件流
offset:偏移量:正数表示向后文件尾部偏移,负数表示向文件开头偏移
whence:相对位置:
SEEK_SET:相对于文件开头
SEEK_CUR:相对于文件当前位置
SEEK_END:相对于文件末尾
返回值:成功:0
失败:-1
注:当打开文件的方式为a或a+时,fseek不起作用
long ftell(FILE *stream);
功能:获取当前的文件位置
参数:要检测的文件流
返回值:成功:当前的文件位置,出错:-1