Linux 软件编程:IO——标准IO
一、IO 基本概念
- 定义:IO 指 input/output(输入 / 输出)。
- 核心特点:在 Linux 系统中,一切皆是文件,IO 操作的对象是文件。
二、文件相关内容
- 文件的定义:一段数据的集合,通常存放在外存中,掉电后数据不会丢失。
- 文件分类及对应 IO 操作:
分类 子项 具体内容 文件分类 块设备文件(b) 按块扫描信息,通常为存储设备,对应文件 IO 操作123 字符设备文件(c) 按字符扫描信息,一般为普通设备,对应文件 IO 操作456 目录文件(d) 存放文件的文件夹,对应目录 IO / 文件 IO 操作789 普通文件(-) 存放信息的文件,分 ASCII 码文件(如程序、文本)和二进制文件(如图片、音视频),对应标准 IO / 文件 IO 操作10111213 链接文件(l) 操作等价于操作指向的文件,对应链接 IO / 文件 IO 操作151617 套接字文件(s) 用于进程间通信,对应文件 IO 操作181920 管道文件(p) 用于进程间通信,对应文件 IO 操作
三、标准 IO
- 概念:通常用来操作普通文件。
- 普通文件类型:
- ASCII 码文件:文件中的所有内容均为能够在屏幕上显示的 ASCII 码字符,程序、文本文件均为此类。
- 二进制文件:文件中的所有内容均为数据对应的二进制形式存放(包含一些不能在界面上显示的内容),图片、音视频、压缩包均为此类,且 ASCII 码文件本质也是二进制文件。
- 标准 IO 的接口:
- fopen/fclose
- fgetc/fputc
- fgets/fputs
- fscanf/fprintf
- fread/fwrite
- fseek/rewind/ftell
- 操作步骤:
- 打开文件
- 读写文件
- 关闭文件
- 文件的打开与关闭:
- fopen 函数:
- 原型:
FILE *fopen(const char *pathname, const char *mode);
- 功能:打开 pathname 指向字符串对应的文件,并和它建立一个流。
- 参数:pathname 为要打开的文件路径字符串;mode 为打开方式。
- 打开方式说明:
- 只读:文件存在只读打开,文件不存在报错。
- r+:读写,文件存在读写打开,文件不存在报错。
- w:只写,文件存在清 0,文件不存在创建,只写打开。
- w+:写读,文件存在清 0,文件不存在创建,写读打开。
- a:追加,文件存在追加,文件不存在创建,只写打开。
- a+:追加读写,文件存在追加,文件不存在创建,读写打开。
- 返回值:成功返回 FILE* 指针,失败返回 NULL。
- 原型:
- fclose 函数:
- 原型:
int fclose(FILE *stream);
- 功能:关闭已经打开的流。
- 参数:stream 为文件流指针。
- 返回值:成功返回 0,失败返回 EOF(-1)。
- 原型:
- fopen 函数:
- 字符读写函数:
- fputc 函数:
- 原型:
int fputc(int c, FILE *stream);
- 功能:将字符 c 写入流中。
- 参数:c 为要写入的字符;stream 为文件流指针。
- 返回值:成功返回输出的 ASCII 码值,失败返回 EOF。
- 注意:putchar () 等价于 fputc (ch, stdout)。
- 原型:
- fgetc 函数:
- 原型:
int fgetc(FILE *stream);
- 功能:读取流中的下一个字符。
- 参数:stream 为文件流指针。
- 返回值:成功返回读到字符的 ASCII 码值,失败或者读到文件末尾返回 EOF。
- 注意:ch = getchar () 等价于 ch = fgetc (stdin)。
- 原型:
- fputc 函数:
- 字符串读写函数:
- fputs 函数:
- 原型:
int fputs(const char *s, FILE *stream);
- 功能:向流中写入 s 指向的字符串。
- 参数:s 为要写入的字符串的首地址;stream 为文件流指针。
- 返回值:成功返回非负数,失败返回 EOF。
- 注意:fputs 不会多打印 \n 字符,而 puts 会多打印一个 \n 字符。
- 原型:
- fgets 函数:
- 原型:
char *fgets(char *s, int size, FILE *stream);
- 功能:从流中最多读 size-1 个字节数据放入 s 指向的空间中,遇到 \n 读取截止。
- 参数:s 为存放数据空间的首地址;size 为最多存放元素的个数;stream 为文件流指针。
- 返回值:成功返回存放数据空间的首地址,失败或读到文件末尾返回 NULL。
- 注意:gets 会去掉从终端接收的 \n 字符,fgets 不会去掉从终端接收的 \n 字符。
- 原型:
- fputs 函数:
- 格式化读写函数:
- fprintf 函数:
- 原型:
int fprintf(FILE *stream, const char *format, ...);
- 功能:将格式化的字符串打印在流中。
- 参数:stream 为文件流指针;format 为格式化的字符串;... 为参数。
- 返回值:成功返回打印字符的个数,失败返回负数。
- 原型:
- fscanf 函数:
- 原型:
int fscanf(FILE *stream, const char *format, ...);
- 功能:从流中接收格式化的字符串。
- 参数:stream 为文件流指针;format 为格式化字符串;... 为参数。
- 返回值:成功返回匹配的输入控制符的个数,失败或读到文件末尾返回 EOF。
- 原型:
- fprintf 函数:
- 已打开的三个特殊的流:
- stdin:标准输入流
- stdout:标准输出流
- stderr:标准出错流
- 说明:printf、puts、putchar 都是通过 stdout 流实现在终端信息打印;scanf、gets、getchar 都是通过 stdin 流实现获得终端信息;perror 通过 stderr 流实现在终端打印出错信息。
四、标准 IO 的缓存
- 特点:标准 IO 是一种有缓存的 IO,效率高,但实时性差。
- 缓存的类型:
- 全缓存(4k):
- 刷新条件:缓存区满 4k 刷新;fflush 函数强制刷新;fclose 或者程序关闭刷新。
- 说明:与文件建立的缓存一般为全缓存。
- 行缓存(1k):
- 刷新条件:缓存区满 1k 刷新;遇到 \n 刷新;fflush 函数强制刷新;fclose 或者程序关闭刷新。
- 说明:与终端建立的缓存一般为行缓存(stdin、stdout 均为行缓存)。
- 不缓存(0k):
- 刷新条件:不缓存立即刷新。
- 说明:出错处理或者人机交互一般使用不缓存(stderr 不缓存)。
- 全缓存(4k):