流 I/O
这些函数处理不同大小和格式的数据,从单个字符到大型数据结构都有。 它们还提供缓冲区,这样能提高性能。 流缓冲区的默认大小为 4K。 这些例程会仅影响由运行时库例程创建的缓冲区,对由操作系统创建的缓冲区不起作用。
流 I/O 例程
例程 | 使用 |
---|---|
%> | 清除流的错误指示器 |
fclose |
关闭流 |
_fcloseall |
关闭所有打开的流,除了 stdin 、 stdout 和 stderr |
%> | 将流与打开的文件的文件描述符相关联 |
feof |
在流上测试文件尾 |
ferror |
在流上测试错误 |
fflush |
刷新到缓冲区或存储设备的流 |
%> | 从流( getc 和 getwc 的函数版本)读取字符 |
%> | 从 stdin ( getchar 和 getwchar 的函数版本)读取字符 |
fgetpos |
获取流的位置指示器 |
%> | 从流读取字符串 |
_fileno |
获取与流关联的文件描述符 |
_flushall |
刷新所有到缓冲区或存储设备的流 |
打开流 | |
将格式化数据写入流 | |
%> | 将字符写入流( putc 和 putwc 的函数版本) |
%> | 将字符写入 stdout ( putchar 和 putwchar 的函数版本) |
%> | 将字符串写入流 |
fread |
从流中读取未格式化的数据 |
重新将 FILE 流指针分配到新的文件或设备 |
|
从流中读取格式化数据 | |
%> | 将文件位置移动到给定位置 |
fsetpos |
设置流的位置指示器 |
%> | 打开具有文件共享的流 |
%> | 获取当前文件位置 |
fwrite |
将未格式化的数据项目写入流 |
%> | 从流( fgetc 和 fgetwc 的宏版本)读取字符 |
%> | 从 stdin ( fgetchar 和 fgetwchar 的宏版本)读取字符 |
_getmaxstdio |
返回在 I/O 流级别允许同时打开的文件数。 |
%> | 从 stdin 读取行 |
_getw |
从流读取二进制 int |
将格式化数据写入 stdout |
|
%> | 将字符写入流( fputc 和 fputwc 的宏版本) |
%> | 将字符写入 stdout ( fputchar 和 fputwchar 的宏版本) |
%> | 将行写入流 |
_putw |
将二进制 int 写入流 |
rewind |
将文件位置移动到的流的开头 |
_rmtmp |
删除 tmpfile 创建的临时文件 |
从 stdin 读取格式化数据 |
|
setbuf |
控制流缓冲 |
_setmaxstdio |
设置在流 I/O 级别同时打开的最大文件数。 |
setvbuf |
控制流缓冲和缓冲区大小 |
将指定长度的格式化数据写入字符串 | |
从标准输入流读取指定长度的格式化数据。 | |
将格式化数据写入字符串 | |
sscanf 、swscanf 、sscanf_s 、_sscanf_s_l、swscanf_s 、_swscanf_s_l |
从字符串读取格式化数据 |
%> | 在给定目录中生成临时文件名 |
%> | 创建临时文件 |
生成临时文件名 | |
%> | 将字符推送回流上 |
将格式化数据写入控制台。 | |
将格式化数据写入流 | |
将格式化数据写入 stdout |
|
将指定长度的格式化数据写入缓冲区 | |
将格式化数据写入缓冲区 |
当程序开始执行时,启动代码将自动开启若干流:标准输入(由 stdin
指向)、标准输出(由 stdout
指向)和标准错误(由 stderr
指向)。 默认情况下,这些流将定向到控制台(键盘和屏幕)。 使用 freopen
将 stdin
、 stdout
或 stderr
重定向到磁盘文件或设备。
默认情况下,会对使用流例程打开的文件执行缓冲操作。 当 stdout
和 stderr
函数是完整的,或在进行了每次库调用之后要写入字符设备时,这两个函数将被刷新。 如果某个程序异常终止,则可能不会刷新输出缓冲区,从而导致数据丢失。 使用 fflush
或 _flushall
来确保将与指定文件关联的缓冲区刷新到操作系统,或刷新所有打开的缓冲区。 操作系统可以在将数据写入磁盘之前缓存数据。 提交到磁盘功能可确保刷新的缓冲区内容不会丢失(如果系统发生故障)。
有两种方法将缓冲区内容提交到磁盘:
与文件 COMMODE.OBJ 链接以设置全局提交标志。 全局标志的默认设置是
n
,意味着“不提交”。用
c
或fopen
将模式标志设置为_fdopen
。
专门使用 c
或 n
标志打开的任何文件的行为以该标志为准,而不考虑全局提交/不提交标志的状态。
如果程序未显式关闭流,则当程序终止时,该流会自动关闭。 但是,你应在程序完成流操作时关闭流,因为可以同时打开的流的数量是有限。 有关此限制的详细信息,请参阅 _setmaxstdio
。
只有通过对 fflush
或对文件定位函数(fseek
、 fsetpos
或 rewind
)进行干预调用时,输入才能直接跟随输出。 如果输入操作遇到文件的末尾,则输入可以后跟输出,而无需对文件定位函数进行干预调用。