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 ' 由具体实现定义。此外,在输入输出时可能需要对字符进行增删改操作,以符合操作系统的文本表示规范(特别地,Windows 操作系统上的 C 流在输出时将 ' \n ' 转换为 ' \r \n ' ,在输入时将 ' \r \n ' 转换为 ' \n ' )。
从文本流中读取的数据,要保证与先前写入该流的数据完全一致,必须同时满足以下所有条件:
- 数据仅包含可打印字符和/或控制字符 ' \t ' 与 ' \n ' (特别地,在 Windows 操作系统上,字符 ' \0 x1A' 会终止输入)。
- 没有任何 ' \n ' 字符紧邻空格字符之前(这类空格字符在后续将输出作为输入读取时可能会消失)。
- 最后一个字符是 ' \n ' 。
一个 二进制流 是有序的字符序列,能够透明地记录内部数据。从二进制流读取的数据始终等于先前写入该流的数据,但允许实现在流末尾追加不确定数量的空字符。宽二进制流不需要以初始移位状态结束。
注释
POSIX明确要求:当流的定向变为宽定向时,当前安装的C区域设置的
LC_CTYPE
facet必须被存储到
FILE
对象中;POSIX要求此后对该流的所有I/O操作都必须使用此
LC_CTYPE
facet,无论之后是否调用
setlocale
,直到流的定向发生改变。
设计初衷是每行文本应由本质上人类可读的数据组成。POSIX实现不区分文本流与二进制流(对 ' \n ' 或任何其他字符均无特殊映射关系)。
参考文献
- C17 标准 (ISO/IEC 9899:2018):
-
- 7.21 输入/输出 <stdio.h> (页码: 217-247)
-
- 7.29 扩展多字节与宽字符工具 <wchar.h> (页码: 295-325)
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.21 输入/输出 <stdio.h> (页码: 296-339)
-
- 7.29 扩展多字节与宽字符工具 <wchar.h> (页码: 402-446)
- C99标准(ISO/IEC 9899:1999):
-
- 7.19 输入/输出 <stdio.h>(页码:262-305)
-
- 7.24 扩展多字节与宽字符工具 <wchar.h>(页码:348-392)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 4.9 输入/输出 <stdio.h>
参见
|
与输入流关联的
FILE
*
类型表达式
与输出流关联的 FILE * 类型表达式 与错误输出流关联的 FILE * 类型表达式 (宏常量) |
|
|
C++ 文档
关于
FILE
|
|