File input/output
File input/output
所述<stdio.h>头部提供通用文件操作支持和建筑材料功能与窄字符输入/输出能力。
该<wchar.h>标头宽字符输入/输出功能提供功能。
I / O流是FILE
只能通过类型指针访问和操作的类型对象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函数在宽字符和多字节字符之间转换,就像通过调用mbrtowc
和wcrtomb
。与在程序中有效的多字节字符串不同,文件中的多字节字符序列可能包含嵌入的空值,不必在初始转换状态下开始或结束。
POSIX要求当前安装的C语言环境的LC_CTYPE构面在其方向变宽时存储在流对象中,并且用于此流上将来的所有I / O,直到方向改变为止,而不管后续调用如何setlocale
。
二进制和文本模式
甲文本流
是由为行(零个或多个字符加上终止字符的有序序列'\n'
)。最后一行是否需要终止'\n'
是实现定义的。可能需要在输入和输出中添加,更改或删除字符,以符合OS中表示文本的约定(特别是Windows OS上的C流转换\n
为\r\n
输出并转换\r\n
为\n
输入)。
只有满足以下所有条件,才能保证从文本流中读入的数据与之前写入该流的数据相等。
- 数据只包括打印字符及控制字符
\t
和\n
(具体地,在Windows操作系统中,字符'\0x1A'
终止输入)
甲二进制流
是可以透明地记录的内部数据的字符的有序序列。从二进制流
中读入的数据总是等于先前写入该数据流的数据。实现只允许在流尾添加一些空字符。宽二进制流
不需要在初始转换状态下结束。
POSIX实现不区分文本流和二进制流(没有针对\ n或任何其他字符的特殊映射)。
函数
| 文件访问|
|:----|
| 在头文件<stdio.h> |中定义
| fopenfopen_s(C11)| 打开一个文件(函数)|
| freopenfreopen_s(C11)| 使用不同的名称(函数)|打开现有流
| fclose | 关闭文件(功能)|
| fflush | 使输出流与实际文件(函数)|同步
| setbuf | 为文件流(函数)|设置缓冲区
| setvbuf | 设置文件流(函数)|的缓冲区及其大小
| 在头文件<wchar.h>中定义
| fwide(C95)| 在宽字符I / O和窄字符I / O(函数)|之间切换文件流
| 直接输入/输出|
| 在头文件<stdio.h> |中定义
| fread | 从文件(函数)|读取
| fwrite | 写入文件(函数)|
| 未格式化的输入/输出|
| 窄字符|
| 在头文件<stdio.h> |中定义
| fgetcgetc | 从文件流(函数)|获取字符
| fgets | 从文件流(函数)|获取字符串
| fputcputc | 将一个字符写入文件流(函数)|
| fputs | 将字符串写入文件流(函数)|
| getchar | 从stdin(function)|读取一个字符
| getsgets_s(直到C11)(自C11)| 从stdin(function)|读取一个字符串
| putchar | 将一个字符写入stdout(function)|
| 放入| 将一个字符串写入stdout(function)|
| ungetc | 将字符放回到文件流(函数)|中
| 宽字符|
| 在头文件<wchar.h>中定义
| fgetwcgetwc(C95)| 从文件流(函数)|获取宽字符
| fgetws(C95)| 从文件流(函数)|获取宽字符串
| fputwcputwc(C95)| 将宽字符写入文件流(函数)|
| fputws(C95)| 将宽字符串写入文件流(函数)|
| getwchar(C95)| 从标准输入(函数)|读取一个宽字符
| putwchar(C95)| 将宽字符写入stdout(function)|
| ungetwc(C95)| 将宽字符放回到文件流(函数)|中
| 格式化输入/输出|
| 窄字符|
| 在头文件<stdio.h> |中定义
| scanffscanfsscanfscanf_sfscanf_ssscanf_s(C11)(C11)(C11)| 从stdin,文件流或缓冲区(函数)|读取格式化的输入
| vscanfvfscanfvsscanfvscanf_svfscanf_svsscanf_s(C99)(C99)(C99)(C11)(C11)(C11)| 使用变量参数列表(函数)|从stdin,文件流或缓冲区中读取格式化的输入
| printfprintfsprintfsnprintfprintf_sfprintf_ssprintf_ssnprintf_s(C99)(C11)(C11)(C11)(C11)| 将格式化输出打印到标准输出,文件流或缓冲区(函数)|
| (C11)(C11)(C11)(C11)(C11)| 使用可变参数列表(函数)|将格式化输出打印到标准输出,文件流或缓冲区
| 宽字符|
| 在头文件<wchar.h>中定义
| wscanffwscanfswscanfwscanf_sfwscanf_sswscanf_s (C95)(C95)(C95)(C11)(C11)(C11)| 从stdin,文件流或缓冲区(函数)|读取格式化的宽字符输入
| vwscanfvfwscanfvswscanfvwscanf_svfwscanf_svswscanf_s (C99)(C99)(C99)(C11)(C11)(C11) | 使用变量参数列表(函数)|从stdin,文件流或缓冲区中读取格式化的宽字符输入
| wprintffwprintfswprintfwprintf_sfwprintf_sswprintf_ssnwprintf_s (C95)(C95)(C95)(C11)(C11)(C11)(C11) | 将格式化的宽字符输出打印到stdout,文件流或缓冲区(函数)|
| vwprintfvfwprintfvswprintfvwprintf_svfwprintf_svswprintf_svsnwprintf_s (C95)(C95)(C95)(C11)(C11)(C11)(C11) | 使用变量参数列表(函数)|将格式化的宽字符输出打印到标准输出,文件流或缓冲区
| 文件定位|
| 在头文件<stdio.h> |中定义
| ftell | 返回当前文件位置指示符(功能)|
| fgetpos | 获取文件位置指示符(函数)|
| fseek | 将文件位置指示器移动到文件(功能)|中的特定位置
| fsetpos | 将文件位置指示器移动到文件(功能)|中的特定位置
| 倒带| 将文件位置指示器移动到文件(函数)|中的开头
| 错误处理|
| 在头文件<stdio.h> |中定义
| clearerr | 清除错误(函数)|
| feof | 检查文件结束(函数)|
| ferror | 检查文件错误(函数)|
| perror | 显示与当前错误对应的字符串到stderr(function)|
| 对文件进行操作|
| 在头文件<stdio.h> |中定义
| 删除| 擦除文件(功能)|
| 重命名| 重命名文件(函数)|
| tmpfiletmpfile_s(C11)| 返回一个指向临时文件(函数)|的指针
| tmpnamtmpnam_s(C11)| 返回一个唯一的文件名(函数)|
类型
| 在头文件<stdio.h> |中定义
|:----|
| 类型| 定义|
| FILE | 类型,能够保存控制CI / O流|所需的所有信息
| fpos_t | 类型,能够在文件|中唯一地指定位置和多字节分析器状态
宏
| 在头文件<stdio.h> |中定义
|:----|
| stdinstdoutstderr | 与FILE *类型的输出流表达式相关联的类型FILE *的表达式与与错误输出流(宏常量)相关联的FILE *类型的输出流表达式相关联。
| EOF | int类型的整型常量表达式和负值(宏常量)|
| FOPEN_MAX | 可同时打开的文件数(宏常量)|
| FILENAME_MAX | char数组需要的大小来保存最长的支持文件名(宏常量)|
| BUFSIZ | setbuf()(宏常量)|使用的缓冲区的大小
| _IOFBF_IOLBF_IONBF | setvbuf()指示完全缓冲的I / O参数给setvbuf()指示缓冲的I / O参数指向未缓冲的I / O(宏常量)的setvbuf()。
| SEEK_SETSEEK_CURSEEK_END | fseek()表示从fileargument的开头搜索到fseek(),表示从当前文件positionargument寻找fseek(),指示从文件末尾搜索(宏常量)。
| TMP_MAXTMP_MAX_S(C11)| 可由tmpnam生成的唯一文件名的最大数目tmpnam_s(宏常量)可生成的唯一文件名的最大数目|
| L_tmpnamL_tmpnam_s(C11)| 字符数组所需的大小,以保存tmpnamsize的结果,以便保存tmpnam_s(宏常量)的结果。
参考
- C11标准(ISO / IEC 9899:2011):