FILE
在标头 <stdio.h> 定义
|
||
typedef /* 未指明 */ FILE; |
||
每个 FILE
对象都表示一个 C 流。
C 标准没有规定 FILE
是否为一个完整的对象类型。虽然一个有效的 FILE
可以被复制,但是使用指向这种副本的指针作为 I/O 函数的参数是未定义的行为。换言之 FILE
可能在语义上是不可复制的。
I/O 流能用于无格式和有格式的输入及输出。另外,处理输入输出的函数也会受到本地语言环境的影响,以便按需进行宽/多字节的转换。
流状态
除了访问设备所必须的特定于系统的信息(例如 POSIX 文件描述符)之外,每个 FILE
对象还直接或间接的包含以下信息:
- (C95)字符宽度:未设置、窄或宽。
- (C95)多字节与宽字符间转换的分析状态(一个 mbstate_t 类型的对象)
- 缓冲状态:无缓冲、行缓冲、全缓冲。
- 缓冲区,可为外部的用户提供缓冲区所替换。
- I/O 模式:输入、输出或更新(兼具输入与输出)。
- 二进制/文本模式指示符。
- 文件尾状态指示符。
- 错误状态指示符。
- 文件位置指示符,可作为 fpos_t 类型对象访问,对于宽流包含剖析状态。
- (C11)在多个线程读、写、寻位或查询流时避免数据竞争的再入锁。
窄/宽字符取向
新打开的流无取向。首次对 fwide 或者任何 I/O 函数的调用将建立其取向:宽 I/O 函数令流为宽取向,窄 I/O 函数令流为窄取向。一旦设置,则只能以 freopen 更改其取向。不能在宽取向流上调用窄 I/O 函数,不能在窄取向流上调用宽 I/O 函数。宽 I/O 函数,如同通过以流所描述的转换状态调用 mbrtowc 或 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
刻面存储于 FILE
对象中; POSIX 要求将此 LC_CTYPE
刻面用于此流上的所有将来 I/O 直至面向被更改,无关乎任何到 setlocale 的后继调用。
有意令文本的每行均由实质上人类可读的数据组成。 POSIX 实现不辨别文本与二进制流(无 '\n' 或任何其他字符的特殊映射)。
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.21 Input/output <stdio.h> (第 217-247 页)
- 7.29 Extended multibyte and wide character utilities <wchar.h> (第 295-325 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.21 Input/output <stdio.h> (第 296-339 页)
- 7.29 Extended multibyte and wide character utilities <wchar.h> (第 402-446 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.19 Input/output <stdio.h> (第 262-305 页)
- 7.24 Extended multibyte and wide character utilities <wchar.h> (第 348-392 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.9 INPUT/OUTPUT <stdio.h>
参阅
与标准输入流关联的 FILE* 类型表达式 与标准输出流关联的 FILE* 类型表达式 与标准错误输出流关联的 FILE* 类型表达式 (宏常量) |