FILE

来自cppreference.com
< c‎ | io
 
 
文件输入/输出
类型与对象
FILE
    

函数
文件访问
直接输入/输出
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
有格式输入
 
在标头 <stdio.h> 定义
typedef /* 未指明 */ FILE;

每个 FILE 对象都表示一个 C 流。

C 标准没有规定 FILE 是否为一个完整的对象类型。虽然一个有效的 FILE 可以被复制,但是使用指向这种副本的指针作为 I/O 函数的参数是未定义的行为。换言之 FILE 可能在语义上是不可复制的。

I/O 流能用于无格式和有格式的输入及输出。另外,处理输入输出的函数也会受到本地语言环境的影响,以便按需进行宽/多字节的转换。

流状态

除了访问设备所必须的特定于系统的信息(例如 POSIX 文件描述符)之外,每个 FILE 对象还直接或间接的包含以下信息:

  1. (C95)字符宽度:未设置、窄或宽。
  2. (C95)多字节与宽字符间转换的分析状态(一个 mbstate_t 类型的对象)
  3. 缓冲状态:无缓冲、行缓冲、全缓冲。
  4. 缓冲区,可为外部的用户提供缓冲区所替换。
  5. I/O 模式:输入、输出或更新(兼具输入与输出)。
  6. 二进制/文本模式指示符。
  7. 文件尾状态指示符。
  8. 错误状态指示符。
  9. 文件位置指示符,可作为 fpos_t 类型对象访问,对于宽流包含剖析状态。
  10. (C11)在多个线程读、写、寻位或查询流时避免数据竞争的再入锁。

窄/宽字符取向

新打开的流无取向。首次对 fwide 或者任何 I/O 函数的调用将建立其取向:宽 I/O 函数令流为宽取向,窄 I/O 函数令流为窄取向。一旦设置,则只能以 freopen 更改其取向。不能在宽取向流上调用窄 I/O 函数,不能在窄取向流上调用宽 I/O 函数。宽 I/O 函数,如同通过以流所描述的转换状态调用 mbrtowcwcrtomb,进行宽与多字节字符间的转换。不同于程序中合法的多字节字符串,文件中的多字节字符可能含有嵌入的空字符,且不必然以初始迁移状态开始或结束。

具有宽取向的流的转换状态,是在设置流取向时所安装的 C 本地语言环境所设立的。

二进制与文本模式

文本流是能组合成行(零或更多字符加上终止的 '\n' )的有序字符序列;行能分解成零或多个字符加一个终止的 '\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 直至面向被更改,无关乎任何到 setlocale 的后继调用。

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

引用

  • C17 标准(ISO/IEC 9899:2018):
  • 7.21 Input/output <stdio.h> (第 217-247 页)
  • 7.29 Extended multibyte and wide character utilities <wchar.h> (第 295-325 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.21 Input/output <stdio.h> (第 296-339 页)
  • 7.29 Extended multibyte and wide character utilities <wchar.h> (第 402-446 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.19 Input/output <stdio.h> (第 262-305 页)
  • 7.24 Extended multibyte and wide character utilities <wchar.h> (第 348-392 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.9 INPUT/OUTPUT <stdio.h>

参阅

与标准输入流关联的 FILE* 类型表达式
与标准输出流关联的 FILE* 类型表达式
与标准错误输出流关联的 FILE* 类型表达式
(宏常量)