std:: FILE
|
定义于头文件
<cstdio>
|
||
|
typedef
/* 未指定 */
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 ' 由具体实现定义。此外,在输入输出时可能需要对字符进行添加、修改或删除,以符合操作系统的文本表示规范(特别地,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
|
|