FILE
在标头 <stdio.h> 定义
|
||
typedef /* unspecified */ 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 转换。不同于程序中合法的多字节字符串,文件中的多字节字符可以含有嵌入的空字符且不必以初始迁移状态开始或结束。
二进制与文本模式
文本流是能组合成行(零或更多字符加上终止的 '\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* 类型表达式 (宏常量) |