命名空间
变体
操作

std::FILE

来自 cppreference.cn
< cpp‎ | io‎ | c
 
 
 
 
定义于头文件 <cstdio>
typedef /* unspecified */ 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::mbrtowcstd::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,而与后续调用 std::setlocale 无关。

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

[编辑] 参见

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