命名空间
变体
操作

文件

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

函数
文件访问
直接输入/输出
无格式输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)
格式化输入
(C99)(C99)(C99)(C11)(C11)(C11)     
 
定义在头文件 <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' 是实现定义的。此外,可能需要在输入和输出中添加、更改或删除字符,以符合操作系统中表示文本的约定(特别是,Windows 操作系统上的 C 流在输出时将 '\n' 转换为 '\r\n',在输入时将 '\r\n' 转换为 '\n')。

从文本流中读取的数据只有在以下条件全部满足时才能保证与之前写入该流的数据相等

  • 数据仅包含可打印字符和/或控制字符 '\t''\n'(特别是,在 Windows 操作系统上,字符 '\0x1A' 会终止输入)。
  • 没有 '\n' 字符紧接在空格字符之前(这些空格字符可能在后来将此类输出作为输入读取时消失)。
  • 最后一个字符是 '\n'

二进制流 是一个按顺序排列的字符序列,可以透明地记录内部数据。从二进制流中读取的数据始终等于之前写入该流的数据,除了实现允许在流的末尾附加不确定的空字符数。宽字节二进制流不必在初始移位状态下结束。

[编辑] 说明

POSIX 明确要求在流的方向变为宽字节的那一刻将当前安装的 C 区域设置的 LC_CTYPE 面存储在 FILE 对象中;POSIX 要求在方向更改之前,将此 LC_CTYPE 面用于此流上的所有后续 I/O,无论之后是否调用了 setlocale

目的是使文本的每一行都包含本质上是人类可读的数据。POSIX 实现不区分文本流和二进制流(没有针对 '\n' 或任何其他字符的特殊映射)。

[编辑] 参考文献

  • C17 标准 (ISO/IEC 9899:2018)
  • 7.21 输入/输出 <stdio.h> (p: 217-247)
  • 7.29 扩展多字节和宽字符实用工具 <wchar.h> (p: 295-325)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.21 输入/输出 <stdio.h> (p: 296-339)
  • 7.29 扩展多字节和宽字符实用工具 <wchar.h> (p: 402-446)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.19 输入/输出 <stdio.h> (p: 262-305)
  • 7.24 扩展多字节和宽字符实用工具 <wchar.h> (p: 348-392)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.9 输入/输出 <stdio.h>

[编辑] 另请参阅

类型为 FILE* 的表达式,与输入流相关联
与输出流关联的类型为 FILE* 的表达式
与错误输出流关联的类型为 FILE* 的表达式
(宏常量) [编辑]
C++ 文档 for FILE