IO 流
本节介绍 <stdio.h> 的核心抽象:流 (Stream)。
1. 什么是流
在 C 标准库中,流是一个用于读写字节序列的对象。流可能对应一个文件,也可能对应终端、管道或其他设备;但这些“对应关系”属于实现细节,本章只依赖标准保证的行为。
2. FILE 与 FILE*
FILE 类型表示一个流对象;FILE* 是指向流对象的指针。FILE 的内部表示由实现定义,程序必须通过标准库函数来操作它。
3. 三个标准流
在宿主环境 (Hosted environment) 中,C 程序通常具有三个已经打开的标准流:
stdin:标准输入stdout:标准输出stderr:标准错误输出
它们都是 FILE* 类型的对象。
stdout 与 stderr 的区别
二者都是输出,但它们的缓冲策略与用途不同:stderr 常用于输出错误信息,以便和正常输出分离。
4. 文本流与二进制流
对文件流而言,C 标准区分文本流 (Text stream) 与二进制流 (Binary stream)。
- 文本流允许实现进行换行符转换等处理,因此“读到的字节序列”与“文件中实际存储的字节”不一定一致。
- 二进制流以字节为单位进行输入输出,不进行文本转换。
因此,当你需要精确控制字节序列(例如自定义文件格式)时,应优先使用二进制流。
5. 缓冲
标准库可能对流进行缓冲,以减少与外部设备交互的次数。常见策略包括:
- 全缓冲:积累到一定量再读写;
- 行缓冲:遇到换行符等事件时刷新;
- 无缓冲:每次读写都直接进行。
缓冲控制接口见 14.5。
6. 习题
#11411
⚡3⏳2
写一个程序,把标准输入的内容逐字符地复制到标准输出。
要求:
- 使用
getchar/putchar(或fgetc(stdin)/fputc(stdout)); - 正确处理 EOF。