std::FILE

< cpp‎ | io‎ | c
 
 
 
 
定义于头文件 <cstdio>
typedef /* implementation-defined */ 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 转换。不同于程序中合法的多字节字符串,文件中的多字节字符可以含有嵌入的空字符且不必以初始迁移状态开始或结束。

二进制与文本模式

文本流是能组合成行(零或更多字符加上终止的 '\n' )的有序字符序列;行能分解成零或多个字符加一个终止的 '\n' (“换行”)字符。最后一行是否要求终止的 '\n' 是实现定义的。另外,可能必须在输入与输出时添加、切换或删除字符,以符合 OS 中的表示文本(尤其是 Windows OS 上的 C 流在输出时将 '\n' 转换为 '\r\n' ,输入时将 '\r\n' 转换为 '\n' )。

仅若下列条件全为真,从文本流读取的数据才保证与先前写出到该文本流者比较相等:

  • 数据由打印字符和控制字符 '\t' 及/或 '\n' 组成(尤其是 Windows OS 上,字符 '\0x1A' 终止输入)。
  • 无立即为空格符所前驱的 '\n' 字符立即为空格符所前趋((当这种输出随后作为输入读入时,这种空格字符可能消失)。
  • 末字符是 '\n'

二进制流是能通透地记录内部数据的有序字符序列。从二进制流读取的数据始终与先前写出到该流者比较相等,除了允许实现后附不确定数量的空字符到流结尾。宽二进制流不必终止于初始迁移状态。

注解

POSIX 显式要求在流的面向变成宽时,将当前安装的 C 本地环境的 LC_CTYPE 刻面存储于 std::FILE 对象中; POSIX 要求将此 LC_CTYPE 刻面用于此流上的所有将来 I/O 直至面向被更改,无关乎任何到 std::setlocale 的后继调用。

有意令文本的每行均由实质上人类可读的数据组成。 POSIX 实现不辨别文本与二进制流(无 '\n' 或任何其他字符的特殊映射)。

参阅

抽象原生设备
(类模板)
抽象原生文件设备
(类模板)