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 并使用流描述的转换状态一样。与程序中有效的多字节字符串不同,文件中的多字节字符序列可能包含嵌入的空字符,并且不必以初始移位状态开始或结束。
宽方向流的转换状态由设置流方向时安装的 C 区域设置建立。
[编辑] 二进制和文本模式
文本流是一个有序的字符序列,可以组成行;一行可以分解为零个或多个字符加上一个终止的 '\n' (“换行”)字符。最后一行是否需要终止 '\n' 是实现定义的。此外,可能需要在输入和输出时添加、更改或删除字符,以符合 OS 中表示文本的约定(特别是,Windows OS 上的 C 流在输出时将 '\n' 转换为 '\r\n',并在输入时将 '\r\n' 转换为 '\n')。
只有当以下每个条件都为真时,从文本流中读取的数据才能保证与先前写入该流的数据相等
- 数据仅包含可打印字符和/或控制字符 '\t' 和 '\n' (特别是,在 Windows OS 上,字符 '\0x1A' 终止输入)。
- 没有 '\n' 字符紧跟在空格字符之后(当稍后将此类输出作为输入读取时,此类空格字符可能会消失)。
- 最后一个字符是 '\n'。
二进制流是一个有序的字符序列,可以透明地记录内部数据。从二进制流中读取的数据始终等于先前写入该流的数据,但允许实现将不确定数量的空字符附加到流的末尾。宽二进制流不需要以初始移位状态结束。
[编辑] 注释
POSIX 显式要求在流的方向变为宽方向的时刻,将当前安装的 C 区域设置的 LC_CTYPE
facet 存储在 FILE
对象中;POSIX 要求将此 LC_CTYPE
facet 用于此流上的所有未来 I/O,直到方向更改为止,而与后续调用 setlocale 无关。
文本的每一行都旨在由本质上是人类可读的数据组成。POSIX 实现不区分文本流和二进制流(没有针对 '\n' 或任何其他字符的特殊映射)。
[编辑] 参考文献
- C17 标准 (ISO/IEC 9899:2018)
- 7.21 输入/输出 <stdio.h> (p: 217-247)
- 7.29 扩展多字节和宽字符实用程序 <wchar.h> (p: 295-325)
- C11 标准 (ISO/IEC 9899:2011)
- 7.21 输入/输出 <stdio.h> (p: 296-339)
- 7.29 扩展多字节和宽字符实用程序 <wchar.h> (p: 402-446)
- C99 标准 (ISO/IEC 9899:1999)
- 7.19 输入/输出 <stdio.h> (p: 262-305)
- 7.24 扩展多字节和宽字符实用程序 <wchar.h> (p: 348-392)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.9 输入/输出 <stdio.h>
[编辑] 参见
与输入流关联的 FILE* 类型的表达式 与输出流关联的 FILE* 类型的表达式 与错误输出流关联的 FILE* 类型的表达式 (宏常量) | |
C++ 文档 关于 FILE
|