基本概念
输入:数据从内核空间流向用户空间,站在用户空间的角度来看就是将数据从内核空间读到用户空间,属于读操作,例如库函数scanf; 输出:数据从用户空间流向内核空间,站在用户空间的角度来看就是将数据从用户空间写到内核空间,属于写操作,例如库函数printf。
标准IO
特性: 1、标准C库函数 2、属于高级IO,移植性和通用性较强 3、自带缓存,用于临时存放数据,以减少操作磁盘的次数,保护硬件 4、通过文件流操作IO 注:文件流本质上是结构体指针,指向struct _IO_FILE类型的结构体;此外标准IO也是基于文件IO来实现的。 linux自带3个标准流 标准输出 stdout 使用行缓存,1k大小,其刷新条件是 1、缓存区已满 2、程序正常退出(包括main函数执行return或程序执行标准库函数exit) 3、调用fflush函数,强制刷新缓存 4、遇到换行符’\n’ 标准输入 stdin 使用全缓存,4k大小,其刷新条件是 1、缓存区已满 2、程序正常退出 3、调用fflush函数,强制刷新缓存 4、关闭流 标准错误 stderr 无缓存
常用接口
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
功能:打开文件流
参数path:文件路径
参数mode:操作模式,如下
"r"读操作,文件若存在则从文件开头读,文件不存在会报错;
"r+"读写操作,文件若存在则从文件开头读写,文件不存在会报错;
"w"写操作,文件若存在则先清空后写入,文件不存在则创建同名文件;
"w+"读写操作,文件若存在则先清空后读写,文件不存在则创建同名文件;
"a"追加写操作,文件若存在则从文件末尾写,文件不存在则创建同名文件;
"a+"追加写和读操作,文件若存在则从文件末尾写,从文件开头读,文件不存在则创建同名文件;
返回:正确返回文件流指针,异常返回NULL并设置errno值。
errno是linux通用类型错误号,其数值与对应的错误绑定,可参考/usr/include/asm-gengeric/errno-base.h文件;
#include <stdio.h>
#include <errno.h>
#include <string.h>
char *strerror(int errnum); //根据errno获取对应的错误描述
void perror(const char *s); //errno对应错误输出
例如perror("fail to open"); 等价于 fprintf(stderr, "fail to open:%s\n", strerror(errno));
int fclose(FILE *fp);
功能:关闭指定的文件流
返回:正确返回0,异常返回-1并设置errno值
写操作
int fprintf(FILE *stream, const char *format, ...);
功能:格式化输出到指定文件流,类似于
int printf(const char *format, ...); //格式化输出到标准输出流 stdout
int fputc(int c, FILE *stream);
功能:将字符输出到指定文件流
返回:正确返回字符的ascii码,异常返回-1
fputc(int c, stdout); 等价于 putchar(int c);
读操作
int fgetc(FILE *stream);
功能:从指定文件流读取一个字符
返回:正确返回字符的ascii码,异常返回-1
异常返回有以下情况
1、读到文件末尾
2、操作出现错误
因此需要用feof函数做进一步判断
int feof(FILE *stream);
功能:判断是否指向文件末尾
返回:在文件末尾时返回非0,不在文件末尾时返回0
文件IO
特性: 1、系统调用函数 2、属于低级IO,移植性较差 3、不带缓存(实质是内核缓存) 4、通过文件描述符操作IO 注:文件描述符本质上是非负整数的索引值,即数组下标,而数组成员就是文件结构体指针。
|