std::FILE
在头文件 <cstdio> 中定义 |
||
typedef /* unspecified */ FILE; |
||
每个 std::FILE
对象表示一个 C 流。
C 标准 (C++ 标准引用) 没有指定 std::FILE
是否为完整对象类型。虽然可能可以复制有效的 std::FILE
,但将指向此类副本的指针用作 I/O 函数的参数将调用未指定的行为。换句话说,std::FILE
在语义上可能不可复制。
I/O 流可用于非格式化和格式化输入和输出。此外,处理输入和输出的函数也可以是本地化的,这样可以根据需要执行宽字符/多字节转换。
内容 |
[编辑] 流状态
除了访问设备所需的系统特定信息外 (例如,POSIX 文件描述符),每个 std::FILE
对象直接或间接地包含以下内容
- 字符宽度:未设置、窄字符或宽字符。
- 多字节和宽字符之间转换的解析状态 (类型为 std::mbstate_t 的对象)
- 缓冲状态:无缓冲、行缓冲、全缓冲。
- 缓冲区,可以使用外部用户提供的缓冲区替换它。
- I/O 模式:输入、输出或更新 (输入和输出)。
- 二进制/文本模式指示符。
- 文件结尾状态指示符。
- 错误状态指示符。
- 文件位置指示符,可作为类型为 std::fpos_t 的对象的访问方式,对于宽字符流,包括解析状态。
- (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' 是由实现定义的。此外,可能需要在输入和输出中添加、更改或删除字符,以符合 OS 中表示文本的约定 (特别是,Windows OS 上的 C 流将 '\n' 转换为 '\r\n',并在输出时将 '\r\n' 转换为 '\n',在输入时进行转换)。
从文本流中读取的数据保证与先前写入该流的数据相等,只有在以下每个条件为真时才成立
- 数据仅由可打印字符和/或控制字符 '\t' 和 '\n' 组成 (特别是在 Windows OS 上,字符 '\0x1A' 终止输入)。
- 没有 '\n' 字符紧接在空格字符之前 (当这样的输出以后作为输入读取时,这样的空格字符可能会消失)。
- 最后一个字符是 '\n'。
二进制流 是一个有序的字符序列,可以透明地记录内部数据。从二进制流中读取的数据始终等于先前写入该流的数据,只是允许实现将不确定数量的空字符追加到流的末尾。宽字符二进制流不必在初始移位状态结束。
[编辑] 说明
POSIX 明确要求将当前安装的 C 本地化的 LC_CTYPE
面在流的方向变为宽字符的瞬间存储在 FILE
对象中;POSIX 要求此 LC_CTYPE
面用于此流上的所有未来 I/O,直到方向更改,无论以后是否调用 std::setlocale。
它旨在使文本的每一行都由本质上是人类可读的数据组成。POSIX 实现不区分文本流和二进制流 (没有针对 '\n' 或任何其他字符的特殊映射)。
[编辑] 另请参阅
抽象原始设备 (类模板) | |
实现原始文件设备 (类模板) | |
与输入流关联的类型为 FILE* 的表达式与输出流关联的类型为 FILE* 的表达式与错误输出流关联的类型为 FILE* 的表达式(宏常量) | |
C 文档 用于 FILE
|