Namespaces
Variants

FILE

From cppreference.net
< c ‎ | io
定义于头文件 <stdio.h>
typedef /* 未指定 */ FILE ;

每个 FILE 对象表示一个 C 流。

C 标准未规定 FILE 是否为完整对象类型。虽然复制有效的 FILE 可能可行,但将指向此类副本的指针用作 I/O 函数的参数会引发未指定行为。换言之, FILE 在语义上可能是不可复制的。

I/O 流可用于无格式和带格式的输入输出。此外,处理输入输出的函数还可具备区域设置敏感性,以便在必要时执行宽字符/多字节转换。

目录

流状态

除了访问设备所需的系统特定信息( 例如, POSIX 文件描述符)外,每个 FILE 对象直接或间接包含以下内容:

  1. (C95) 字符宽度:未设置、窄字符或宽字符。
  2. (C95) 多字节字符与宽字符转换时的解析状态(类型为 mbstate_t 的对象)
  3. 缓冲状态:无缓冲、行缓冲或全缓冲。
  4. 缓冲区(可被外部用户提供的缓冲区替换)。
  5. I/O 模式:输入、输出或更新(同时支持输入和输出)。
  6. 二进制/文本模式指示器。
  7. 文件结束状态指示器。
  8. 错误状态指示器。
  9. 文件位置指示器(可作为 fpos_t 类型对象访问),对于宽字符流包含解析状态。
  10. (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