四、IO
1. 概念
1. IO 指 input / output
2. Linux系统中一切皆是文件
3. IO操作的对象是文件
2. 文件
1. 概念
一段数据的集合
2. 特点
文件通常存放在外存中,掉点后数据不会丢
3. 分类
- b(block,块设备文件)
-- 按块扫描信息的文件,通常用于存储设备
-- 数据读写以固定大小块为单位,支持随机访问
-- 文件IO
- c(character,字符设备文件)
-- 按字符扫描信息的文件,通常用于串行设备
-- 数据是流式的,通常不支持随机访问
-- 文件IO
- d(directory,目录文件)
-- 表示一个目录,用于存放其他文件和子目录的文件夹
-- 目录IO/文件IO
- -(普通文件)
-- 常见的文件类型,存放一般信息的文件
-- 标准IO/文件IO
- l(link,链接文件)
-- 操作文件等价于操作文件指向的文件
-- 链接IO/文件IO
- s(socket,套接字文件)
-- 用来进程间通信,用于网络通信或本地进程通信
-- 文件IO
- p(pipe,管道文件)
-- 用来进程间通信,一种单向数据通道,用于命令间的数据传递
-- 文件IO
3. 标准IO
1. 概念
用来操作普通文件
2. 文件类型
1. ASCII码文件
文件中的所有内容均为能够在屏幕上显示的ASCII码字符
程序、文本文件均为ASCII码文件
2. 二进制文件
文件中的所有内容均为数据对应的二进制形式存放,包含一些不能在界面上显示的内容
ASCII码文件也是二进制文件
图片、音视频、压缩包均为二进制文件
3. 标准IO的接口
1. fopen / fclose
2. fgetc / fputc
3. fgets / fputs
4. fscanf / fprintf
5. fread / fwrite
6. fseek / rewind/ftell
4. 流
stdin:标准输入流
stdout:标准输出流
stderr:标准出错流
printf、puts、putchar 通过stdout流实现在终端信息打印
scanf、gets、getchar 通过stdin流实现获得终端信息
perror 通过stderr流实现在终端打印出错信息
5. 文件的打开
1. fopen
- 原型:FILE *fopen(const char *pathname, const char *mode);
- 功能:
打开pathname指向字符串对应的文件,并且和它建立一个流
- 参数:
pathname:要打开的文件路径字符串,mode:打开的方式
- 返回值:
成功返回FILE*指针, 失败返回NULL
r 只读 文件存在只读打开,文件不存在报错
r+ 读写 文件存在读写打开,文件不存在报错
w 只写 文件存在清零,文件不存在创建,只写打开
w+ 写读 文件存在清零,文件不存在创建,写读打开
a 追加 文件存在追加,文件不存在创建,只写打开
a+ 追加读写 文件存在追加,文件不存在创建,写读打开
2. fclose
- 原型:int fclose(FILE *stream);
- 功能:
关闭已经打开的流
- 参数:
stream:文件流指针
- 返回值:
成功返回0,失败返回EOF(-1)
3. fputc
- 原型:int fputc(int c, FILE *stream);
- 功能:
将字符c写入流中
- 参数:
c:要写入的字符,stream:文件流指针
- 返回值:
成功返回输出的ASCII码值, 失败返回EOF
putchar() 等价于 fputc(ch, stdout)
4. fgetc
- 原型:int fgetc(FILE *stream);
- 功能:
读取流中的下一个字符
- 参数:
stream:文件流指针
- 返回值:
成功返回读到字符的ASCII码值,失败或者读到文件末尾返回EOF
ch = getchar() 等价于 ch = fgetc(stdin)
5. fputs
- 原型:int fputs(const char *s, FILE *stream);
- 功能:
向流中写入s指向的字符串
- 参数:
s:要写入的字符串的首地址,stream:文件流指针
- 返回值:
成功返回非负数,失败返回EOF
6. fgets
- 原型:char *fgets(char *s, int size, FILE *stream);
- 功能:
从流中最多读size-1个字节数据放入s指向的空间中,遇到\n读取截止
- 参数:
s:存放数据空间的首地址,size:最多存放元素的个数,stream:文件流指针
- 返回值:
成功返回存放数据空间的首地址
失败返回NULL,读到文件末尾返回NULL
fputs不会多打印\n字符,puts会多打印一个\n字符
gets会去掉从终端接收的\n字符,fgets不会去掉从终端接收的\n字符
7. fprintf
- 原型:int fprintf(FILE *stream, const char *format, ...);
- 功能:
将格式化的字符串打印在流中
- 参数:
stream:文件流指针, format:格式化的字符串, ...:参数
- 返回值:
成功返回打印字符的个数
失败返回负数
8. fscanf
- 原型:int fscanf(FILE *stream, const char *format, ...);
- 功能:
从流中接收格式化的字符串
- 参数:
stream:文件流指针, format:格式化字符串 ...:参数
- 返回值:
成功返回匹配的输入控制符的个数
失败返回EOF,读到文件末尾返回EOF
4. 标准IO的缓存
1. 类型
1. 全缓存(4k)
1.缓存区满刷新缓存
2.刷新条件:
缓存区满4k刷新
fflush函数强制刷新
fclose或者程序关闭刷新
3.与文件建立的缓存一般为全缓存
2. 行缓存(1k)
1. 遇到\n刷新缓存区
2. 刷新条件:
缓存区满1k刷新
遇到\n刷新
fflush函数强制刷
fclose或者程序关闭刷新
3. 与终端建立的缓存一般为行缓存(stdin、stdout均为行缓存)
3. 不缓存(0k)
1. 立即刷新不缓存
2. 刷新条件:
不缓存立即刷新
3. 出错处理或者人机交互一般使用不缓存(stderr不缓存)
2. 标准IO的缓存
1. 特点
标准IO是一种有缓存的IO
效率高
实时性差
2. 标准IO 与 文件IO
标准IO:用户代码 → 库函数 → 缓存 → 内核
路径更长,但效率高。
缓存由标准库管理
文件IO:用户代码 → 内核
直接通过open(),read(),write()等系统调用操作,无中间缓冲区。
实时性强,但频繁调用效率低