关于linux系统编程2——IO编程
IO
1概念:
- io指input/output
- linux系统中一切皆是文件
- 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的接口:
- fopen/fclose
- fgetc/fputc
- fgets/fputs
- fscanf/fprintf
- fread/fwrite
- fseek/rewind/ftell
- 操作步骤:
- 打开文件
- 读写文件
- 关闭文件
文件的打开
1fopen:
原型:FILE *fopen(const char *pathname, const char *mode);
功能:打开pathname指向字符串对应的文件,并且和它建立一个流
参数:
- pathname:要打开的的文件路径字符串
- mode:打开的方式
- r 只读 文件存在只读打开,文件不存在报错
- r+ 读写 文件存在读写打开,文件不存在报错
- w 只写 文件存在清0,文件不存在创建,只写打开
- w+ 写读 文件存在清0,文件不存在创建,写读打开
- a 追加 文件存在追加,文件不存在创建,只写打开
- a+ 追加读写 文件存在追加,文件不存在创建,写读打开
返回值:
成功返回FILE*指针
失败返回NULL
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
注意:
- fputs不会多打印\n字符
- puts会多打印一个\n字符
6. fgets
原型:char *fgets(char *s, int size, FILE *stream);
功能:从流中最多读size-1个字节数据放入s指向的空间中,遇到\n读取截止
参数:s:存放数据空间的首地址size:最多存放元素的个数stream:文件流指针
返回值:成功返回存放数据空间的首地址失败返回NULL读到文件末尾返回NULL
注意:
- 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
已经打开的三个特殊的流:
- stdin:标准输入流
- stdout:标准输出流
- stderr:标准出错流
- scanf、gets、getchar都是通过stdin流实现获得终端信息
- printf、puts、putchar都是通过stdout流实现在终端信息打印
- perror通过stderr流实现在终端打印出错信息
4.标准IO的缓存
1. 标准IO缓存:
- 标准IO是一种有缓存的IO
- 效率高
- 实时性差
2. 缓存的类型:
1. 全缓存(4k):
- 缓存区满刷新缓存
- 刷新条件:
- 缓存区满4k刷新
- fflush函数强制刷新
- fclose或者程序关闭刷新
- 与文件建立的缓存一般为全缓存
2. 行缓存(1k):
- 遇到\n刷新缓存区
- 刷新条件:
- 缓存区满1k刷新
- 遇到\n刷新
- fflush函数强制刷新
- fclose或者程序关闭刷新
- 与终端建立的缓存一般为行缓存(stdin、stdout均为行缓存)
3. 不缓存(0k):
- 立即刷新不缓存
- 刷新条件:
- 不缓存立即刷新
- 出错处理或者人机交互一般使用不缓存(stderr不缓存)
tip:
man手册
1:章节
- 标准命令
- 系统调用
- 库函数
- 设备说明
- 文件格式
- 娱乐
- 杂项
- 管理员命令
2. 使用示例
man 章节号 搜索内容
exe: