Namespaces
Variants

std:: FILE

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

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

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

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

目录

流状态

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

  1. 字符宽度:未设置、窄或宽。
  2. 多字节与宽字符转换的解析状态(类型为 std::mbstate_t 的对象)
  3. 缓冲状态:无缓冲、行缓冲、全缓冲。
  4. 缓冲区,可被外部用户提供的缓冲区替换。
  5. I/O 模式:输入、输出或更新(同时支持输入和输出)。
  6. 二进制/文本模式指示器。
  7. 文件结束状态指示器。
  8. 错误状态指示器。
  9. 文件位置指示器,可作为类型为 std::fpos_t 的对象访问,对于宽字符流包含解析状态。
  10. (C++17) 用于多线程读取、写入、定位或查询流位置时防止数据竞争的可重入锁。

窄与宽定向

新打开的流没有方向性。首次调用 std::fwide 或任何 I/O 函数将确立方向性:宽 I/O 函数使流变为宽定向;窄 I/O 函数使流变为窄定向。一旦设置,方向性只能通过 std::freopen 进行更改。窄 I/O 函数不能在宽定向流上调用;宽 I/O 函数不能在窄定向流上调用。宽 I/O 函数在宽字符与多字节字符之间进行转换,其方式类似于通过调用 std::mbrtowc std::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,无论之后是否调用 std::setlocale ,直到流的方向发生改变。

POSIX实现不区分文本流和二进制流(对 ' \n ' 或任何其他字符没有特殊映射)。每行文本应由本质上人类可读的数据组成。

参见

抽象原始设备
(类模板)
实现原始文件设备
(类模板)
与输入流关联的 FILE * 类型表达式
与输出流关联的 FILE * 类型表达式
与错误输出流关联的 FILE * 类型表达式
(宏常量)
C 文档 关于 FILE