文件输入/输出

来自cppreference.com
< c

<stdio.h>头文件提供通用的文件操作支持,并提供窄字符输入/输出兼容。

<wchar.h>头文件提供宽字符输入/输出兼容。

I/O流是仅能通过FILE*类型指针访问和操作的FILE类型对象(注意:在可以通过以解引用并复制合法的FILE*时,在I/O函数中使用这种副本地址是未定义行为)。每个流都与外部物理设备关联(文件、标准输入流、打印机、串行端口等)。

I/O流可用于无格式和格式输入及输出。它们对本地环境敏感,并会在需要时进行宽/多字节转换。所有流访问同一本地环境对象:最近用setlocale安装者。

在系统指定的需要访问设备的信息外(例如POSIX文件描述符),每个流对象保有下列信息:

1) (C95)字符宽度:未设、窄或宽。
2) 缓冲状态:无缓冲、行缓冲、完全缓冲。
3) 缓冲区,可以为内部缓冲区、用户提供缓冲区替代。
4) I/O模式:输入、输出或更新(同时输入输出)。
5) 二进制/文本模式指示符。
6) 文件尾状态指示符。
7) 错误状态指示符。
8) 文件位置指示符(fpos_t类型对象),对于宽字符流,包含剖析状态(mbstate_t类型对象(C95))。
9) (C11)多个线程读、写、定位或查询定位时用于避免数据竞争的再入锁。

目录

[编辑] 面向窄与宽

新打开的流式没有面向。首个对fwide或任何I/O函数的调用将建立面向:宽I/O函数令流为面向宽的,窄I/O函数令流为面向窄的。只要设定一次,面向就只能通过freopen更改。窄I/O函数不能对面向宽流调用,宽I/O函数不能对面向窄流调用。宽I/O函数在宽字符和多字节字符间转换,如同通过调用mbrtowcwcrtomb。不同于程序中合法的多字节字符串,文件中的多字节字符序列可能包含内嵌空字符,且不必以初始迁移状态为始或为终。

POSIX要求当前安装的C本地环境的LC_CTYPE平面存储进流对象,在其的面对成为宽时,并且它将为此流上的所有未来I/O所用,直到该流被更改,无关乎后继的任何setlocale调用。

[编辑] 二进制与文本模式

文本流是组成行的有序字符序列(零或更多字符加上终止的'\n')。最后一行是否要求终止的'\n'是实现定义的。可以在输出和输出流上添加、改变或删除字符,以符合当前操作系统的文本表示约定(例如,在Windows操作系统上的C流在输出时将\n转换成\r\n,输入时将\r\n转换成\n)。

仅当下列条件为真时,从文本流读取的数据保证比较等于先前写入到该留的数据:

  • 数据仅由打印字符与控制字符\t\n组成(例如,在Windows操作系统上,字符'\x1A'终止输入)。
  • 空白符后没有立即接\n(紧随\n前写入的空白符会在读取时消失)。
  • 最后一个字符是\n

二进制流是能明晰地记录内部数据的有序字符序列。从二进制流读取的数据始终等于之前写入到该流的数据。实现定义仅允许在流结尾添加一定数量的空字符。宽二进制流不需要以初始迁移状态结束。

POSIX实现不区分文本和二进制流(不存在特殊的\n到其他任何字符的映射)。

[编辑] 函数

文件访问
定义于头文件 <stdio.h>
打开文件
(函数) [edit]
以不同名称打开既存的文件流
(函数) [edit]
关闭文件
(函数) [edit]
将输出流与实际文件同步
(函数) [edit]
为文件流设置缓冲区
(函数) [edit]
为文件流设置缓冲区和其大小
(函数) [edit]
定义于头文件 <wchar.h>
(C95)
将文件流在宽字符I/O和窄字符I/O间切换
(函数) [edit]
直接输入/输出
定义于头文件 <stdio.h>
从文件读取
(函数) [edit]
写入到文件
(函数) [edit]
无格式输入/输出
窄字符
定义于头文件 <stdio.h>
从文件流获取一个字符
(函数) [edit]
从文件流获取一个字符串
(函数) [edit]
将一个字符写入文件流
(函数) [edit]
将一个字符串写入文件流
(函数) [edit]
stdin读取一个字符
(函数) [edit]
(C11前)
(C11起)
stdin读取一个字符串
(函数) [edit]
将一个字符写入stdout
(函数) [edit]
将一个字符串写入stdout
(函数) [edit]
将一个字符送回文件流
(函数) [edit]
宽字符
定义于头文件 <wchar.h>
从文件流获取一个宽字符
(函数) [edit]
(C95)
从文件流获取一个宽字符串
(函数) [edit]
将一个宽字符写入文件流
(函数) [edit]
(C95)
将一个宽字符串写入文件流
(函数) [edit]
stdin读取一个宽字符
(函数) [edit]
将一个宽字符写入stdout
(函数) [edit]
将一个宽字符送回文件流
(函数) [edit]
格式输入/输出
窄字符
定义于头文件 <stdio.h>
stdin、文件流或缓冲区读取格式化输入
(函数) [edit]
stdin、文件流或缓冲区读取格式化输入
使用可变参数列表
(函数) [edit]
打印格式化输出到stdout、文件流或缓冲区
(函数) [edit]
打印格式化输出到stdout、文件流或缓冲区
使用可变参数列表
(函数) [edit]
宽字符
定义于头文件 <wchar.h>
stdin、文件流或缓冲区读取格式化宽字符输入
(函数) [edit]
stdin、文件流或缓冲区读取格式化宽字符输入
使用可变参数列表
(函数) [edit]
打印格式化宽字符输出到stdout、文件流或缓冲区
(函数) [edit]
打印格式化宽字符输出到stdout、文件流或缓冲区
使用可变参数列表
(函数) [edit]
文件位置
定义于头文件 <stdio.h>
返回当前的文件位置指示符
(函数) [edit]
获取文件位置指示符
(函数) [edit]
将文件位置指示符移动到文件中的指定位置
(函数) [edit]
将文件位置指示器移动到文件中的指定位置
(函数) [edit]
将文件位置指示器移动到文件首
(函数) [edit]
错误处理
定义于头文件 <stdio.h>
清除错误
(函数) [edit]
检查文件结尾
(函数) [edit]
检查文件错误
(函数) [edit]
将对应当前错误的字符串显示到stderr
(函数) [edit]
文件操作
定义于头文件 <stdio.h>
删除文件
(函数) [edit]
重命名文件
(函数) [edit]
返回指向临时文件的指针
(函数) [edit]
返回唯一的文件名
(函数) [edit]

[编辑] 类型

定义于头文件 <stdio.h>
类型 定义
FILE 类型,足以保有所有C I/O流所需的信息
fpos_t 类型,足以唯一指定文件的位置和多字节剖析状态

[编辑]

定义于头文件 <stdio.h>
stdin
stdout
stderr
与标准输入流关联的FILE*类型表达式
与标准输出流关联的FILE*类型表达式
与标准错误输出流关联的FILE*类型表达式
(宏常量)
EOF
int类型的负值整数常量表达式
(宏常量)
FOPEN_MAX
能同时打开的文件数
(宏常量)
FILENAME_MAX
保有最长受支持文件名所需的字符数组大小
(宏常量)
BUFSIZ
setbuf()所用的缓冲区大小
(宏常量)
_IOFBF
_IOLBF
_IONBF
指示完全缓冲I/O的setvbuf()参数
指示行缓冲I/O的setvbuf()
指示无缓冲I/O的setvbuf()参数
(宏常量)
SEEK_SET
SEEK_CUR
SEEK_END
指示从文件首开始巡位的fseek()参数
指示从文件当前位置开始巡位的fseek()参数
指示从文件尾开始巡位的fseek()参数
(宏常量)
TMP_MAX
TMP_MAX_S

(C11)
tmpnam所能生成的单独文件的最大数量
tmpnam_s所能生成的单独文件的最大数量
(宏常量)
L_tmpnam
L_tmpnam_s

(C11)
保有tmpnam结果所需的数组大小
保有tmpnam_s结果所需的数组大小
(宏常量)

[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21 Input/output <stdio.h> (p: 296-339)
  • 7.29 Extended multibyte and wide character utilities <wchar.h> (p: 402-446)
  • 7.31.11 Input/output <stdio.h> (p: 456)
  • 7.31.16 Extended multibyte and wide character utilities <wchar.h> (p: 456)
  • K.3.5 Input/output <stdio.h> (p: 586-603)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19 Input/output <stdio.h> (p: 262-305)
  • 7.24 Extended multibyte and wide character utilities <wchar.h> (p: 348-392)
  • 7.26.9 Input/output <stdio.h> (p: 402)
  • 7.26.12 Extended multibyte and wide character utilities <wchar.h> (p: 402)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9 INPUT/OUTPUT <stdio.h>
  • 4.13.6 Input/output <stdio.h>

[编辑] 参阅

C风格文件输入/输出C++文档