std::FILE
在标头 <cstdio> 定义
|
||
typedef /* 未指明 */ FILE; |
||
每个 std::FILE
对象代表一个 C 流。
C 标准(为 C++ 标准所引用)不指定 std::FILE
是否为完整对象类型。虽然可能对合法的 std::FILE
进行复制,但以指向这种副本的指针作为 I/O 函数的实参将导致未指明的行为。换言之,std::FILE
可能在语义上不可复制。
I/O 流可同时用于无格式和有格式的输入及输出。另外,处理输入输出的函数亦可以是本地环境敏感的,以按需进行宽/多字节转换。
流状态
除了系统指定的需要访问设备的信息(例如 POSIX 文件描述符)外,每个 std::FILE
对象还直接或间接保有下列信息:
- 字符宽度:未设置、窄或宽。
- 多字节与宽字符间转换的分析状态(std::mbstate_t 类型的对象)
- 缓冲状态:无缓冲、行缓冲、全缓冲。
- 缓冲区,可替换为用户提供的外部缓冲区。
- I/O 模式:输入、输出或更新(兼具输入与输出)。
- 二进制/文本模式指示器。
- 文件尾状态指示器。
- 错误状态指示器。
- 文件位置指示器,可作为 std::fpos_t 类型的对象访问,对于宽流包含分析状态。
- (C++17) 当多个线程进行读、写、寻位或查询流位置时用于避免数据竞争的再入锁。
窄与宽取向
新打开的流无取向。首次对 std::fwide 的调用或 I/O 函数建立取向:宽 I/O 函数令流为宽取向,窄 I/O 函数令流为窄取向。一旦设置,则只能以 std::freopen 更改取向。不能在宽取向流上调用窄 I/O 函数,不能在窄取向流上调用宽 I/O 函数。宽 I/O 函数在宽与多字节字符间,如同通过以流所描述的转换状态调用 std::mbrtowc 或 std::wcrtomb 进行转换。不同于程序中合法的多字节字符串,文件中的多字节字符可以含有嵌入的空字符且不必以初始迁移状态开始或结束。
具有宽取向的流的转换状态,是设置流的取向时由所安装的 C 本地环境所设立的。
二进制与文本模式
文本流是能组合成行(零或更多字符加上终止的 '\n')的有序字符序列;行能分解成零或多个字符加一个终止的 '\n'(“换行”)字符。最后一行是否要求终止的 '\n' 是实现定义的。另外,可能必须在输入与输出时添加、切换或删除字符,以符合 OS 中表示文本的约定(尤其是 Windows OS 上的 C 流在输出时将 '\n' 转换为 '\r\n',输入时将 '\r\n' 转换为 '\n')。
仅若下列条件全为真时,从文本流读取的数据才保证与先前写出到该文本流者比较相等:
- 数据仅由打印字符和/或控制字符 '\t' 及 '\n' 组成(尤其是 Windows OS 上,字符 '\0x1A' 会终止输入)。
- 没有前面紧接空格字符的 '\n' 字符(当这种输出随后作为输入读入时,这种空格字符可能消失)。
- 末字符是 '\n'。
二进制流是能透明地记录内部数据的有序字符序列。从二进制流读取的数据始终与先前写出到该流者比较相等,但允许实现后附不确定数量的空字符到流结尾。宽二进制流不必终止于初始迁移状态。
注解
POSIX 明确要求在流的取向变成宽时,将当前安装的 C 本地环境的 LC_CTYPE
刻面存储于 std::FILE
对象中;POSIX 要求将此 LC_CTYPE
刻面用于此流上的所有未来 I/O 直至其取向被更改,无关乎任何对 std::setlocale 的后继调用。
有意令每个文本行均由基本上人类可读的数据组成。POSIX 实现不辨别文本与二进制流(无 '\n' 或任何其他字符的特殊映射)。
参阅
抽象原生设备 (类模板) | |
实现原生文件设备 (类模板) | |
与输入流关联的 FILE* 类型表达式与输出流关联的 FILE* 类型表达式与错误输出流关联的 FILE* 类型表达式 (宏常量) |