C++ 标准库的 C I/O 子集实现 C 风格流输入/输出操作。
<cstdio>
头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而
<cwchar>
头文件提供有宽字符输入/输出能力的函数。
C 流是
std::FILE
类型对象,只能通过
std
::
FILE
*
类型指针访问及操作(注意:在可能以解引用合法的
std
::
FILE
*
,复制创建
std::FILE
类型的局部对象时,在 I/O 函数使用这种副本的地址是未定义行为)。每个 C 流与外部物理设备(文件、标准输入流、打印机、序列端口等)关联。
C 流能用于无格式和有格式的输入及输出。它们对本地环境敏感,并可在需要时提供宽/多字节转换。不同于关联到其自身本地环境的 C++ 流,所有 C 流都访问同一本地环境对象:最近
std::setlocale
所安装者。
除了访问设备所必须的系统限定信息(例如 POSIX 文件描述符),每个 C 流对象保有以下内容:
1)
字符宽度:未设置、窄或宽。
2)
缓冲状态:无缓冲、行缓冲、全缓冲。
3)
缓冲区,可为外部的用户提供缓冲区所替换。
4)
I/O 模式:输入、输出或更新(兼具输入与输出)。
5)
二进制/文本模式指示器。
6)
文件尾指示器。
7)
错误状态指示器。
9)
(C++17)
在多个线程读、写、寻位或查询流时避免数据竞争的再入锁。
窄与宽面向
新打开的流无面向。首次到
std::fwide
的调用或 I/O 函数建立面向:宽 I/O 函数令流为宽面向,窄 I/O 函数令流为窄面向。一旦设置,则面向只能以
std::freopen
更改。不能在宽面向流上调用窄 I/O 函数,不能在窄面向流上调用宽 I/O 函数。宽 I/O 函数在宽与多字节字符间如同以调用
std::mbrtowc
和
std::wcrtomb
转换。不同于程序中合法的多字节字符串,文件中的多字节字符可以含有嵌入的空字符且不必以初始迁移状态开始或结束。
POSIX 要求在流对象的面向变成宽时,将当前安装的 C 本地环境的 LC_CTYPE 平面存储于其中,而且将它用于此流上的所有将来 I/O 直至面向被更改,无关乎任何到
std::setlocale
的后继调用。
二进制与文本模式
文本流
是被组合进行(零或更多字符加上终止的
'
\n
'
)的有序字符序列。最后一行是否要求终止的
'
\n
'
是实现定义的。可能必须在输入与输出时添加、切换或删除字符,以符合 OS 中的表示文本(尤其是 Windows OS 上的 C 流在输出时将
\n
转换为
\r\n
,输入时将
\r\n
转换为
\n
)。
仅若下列条件全为真,从文本流读取的数据才保证与先前写出到该文本流者比较相等: