流 I/O

这些函数处理不同大小和格式的数据,从单个字符到大型数据结构都有。 它们还提供缓冲区,这样能提高性能。 流缓冲区的默认大小为 4K。 这些例程会仅影响由运行时库例程创建的缓冲区,对由操作系统创建的缓冲区不起作用。

流 I/O 例程

例程 使用
clearerrclearerr_s 清除流的错误指示器
fclose 关闭流
_fcloseall 关闭所有打开的流,除了 stdinstdoutstderr
_fdopen、_wfdopen 将流与打开的文件的文件描述符相关联
feof 在流上测试文件尾
ferror 在流上测试错误
fflush 刷新到缓冲区或存储设备的流
fgetc、fgetwc 从流( getcgetwc的函数版本)读取字符
_fgetchar、_fgetwchar stdingetchargetwchar的函数版本)读取字符
fgetpos 获取流的位置指示器
fgets、fgetws 从流读取字符串
_fileno 获取与流关联的文件描述符
_flushall 刷新所有到缓冲区或存储设备的流
fopen、_wfopenfopen_s、_wfopen_s 打开流
fprintf、_fprintf_l、fwprintf、_fwprintf_lfprintf_s、_fprintf_s_l、fwprintf_s、_fwprintf_s_l 将格式化数据写入流
fputc、fputwc 将字符写入流( putcputwc的函数版本)
_fputchar、_fputwchar 将字符写入 stdoutputcharputwchar的函数版本)
fputs、fputws 将字符串写入流
fread 从流中读取未格式化的数据
freopen、_wfreopenfreopen_s、_wfreopen_s 重新将 FILE 流指针分配到新的文件或设备
fscanf、fwscanffscanf_s、_fscanf_s_l、fwscanf_s、_fwscanf_s_l 从流中读取格式化数据
fseek、_fseeki64 将文件位置移动到给定位置
fsetpos 设置流的位置指示器
_fsopen、_wfsopen 打开具有文件共享的流
ftell、_ftelli64 获取当前文件位置
fwrite 将未格式化的数据项目写入流
getc、getwc 从流( fgetcfgetwc的宏版本)读取字符
getchar、getwchar stdinfgetcharfgetwchar的宏版本)读取字符
_getmaxstdio 返回在 I/O 流级别允许同时打开的文件数。
gets_s、_getws_s stdin 读取行
_getw 从流读取二进制 int
printf、_printf_l、wprintf、_wprintf_lprintf_s、_printf_s_l、wprintf_s、_wprintf_s_l 将格式化数据写入 stdout
putc、putwc 将字符写入流( fputcfputwc的宏版本)
putchar、putwchar 将字符写入 stdoutfputcharfputwchar的宏版本)
puts、_putws 将行写入流
_putw 将二进制 int 写入流
rewind 将文件位置移动到的流的开头
_rmtmp 删除 tmpfile 创建的临时文件
scanf、_scanf_l、wscanf、_wscanf_lscanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l stdin 读取格式化数据
setbuf 控制流缓冲
_setmaxstdio 设置在流 I/O 级别同时打开的最大文件数。
setvbuf 控制流缓冲和缓冲区大小
_snprintf、_snwprintf_snprintf_s、_snprintf_s_l、_snwprintf_s、_snwprintf_s_l 将指定长度的格式化数据写入字符串
_snscanf、_snwscanf_snscanf_s、_snscanf_s_l、_snwscanf_s、_snwscanf_s_l 从标准输入流读取指定长度的格式化数据。
sprintf、swprintfsprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l 将格式化数据写入字符串
sscanf、swscanfsscanf_s、_sscanf_s_l、swscanf_s、_swscanf_s_l 从字符串读取格式化数据
_tempnam、_wtempnam 在给定目录中生成临时文件名
tmpfiletmpfile_s 创建临时文件
tmpnam、_wtmpnamtmpnam_s、_wtmpnam_s 生成临时文件名
ungetc、ungetwc 将字符推送回流上
_vcprintf、_vcwprintf_vcprintf_s、_vcprintf_s_l、_vcwprintf_s、_vcwprintf_s_l 将格式化数据写入控制台。
vfprintf、vfwprintfvfprintf_s、_vfprintf_s_l、vfwprintf_s、_vfwprintf_s_l 将格式化数据写入流
vprintf、vwprintfvprintf_s、_vprintf_s_l、vwprintf_s、_vwprintf_s_l 将格式化数据写入 stdout
_vsnprintf、_vsnwprintfvsnprintf_s、_vsnprintf_s、_vsnprintf_s_l、_vsnwprintf_s、_vsnwprintf_s_l 将指定长度的格式化数据写入缓冲区
vsprintf、vswprintfvsprintf_s、_vsprintf_s_l、vswprintf_s、_vswprintf_s_l 将格式化数据写入缓冲区

当程序开始执行时,启动代码将自动开启若干流:标准输入(由 stdin指向)、标准输出(由 stdout指向)和标准错误(由 stderr指向)。 默认情况下,这些流将定向到控制台(键盘和屏幕)。 使用 freopenstdinstdoutstderr 重定向到磁盘文件或设备。

默认情况下,会对使用流例程打开的文件执行缓冲操作。 当 stdoutstderr 函数是完整的,或在进行了每次库调用之后要写入字符设备,则这两个函数将被刷新。 如果某个程序异常终止,则可能不会刷新输出缓冲区,从而导致数据丢失。 使用 fflush_flushall 以确保与指定文件相关联的缓冲区或所有打开的缓冲区被刷新到操作系统,操作系统在将数据写入磁盘之前可缓存数据。 “提交到磁盘”功能可确保刷新的缓冲区内容不会在出现系统故障时丢失。

有两种方法将缓冲区内容提交到磁盘:

  • 与文件 COMMODE.OBJ 链接以设置全局提交标志。 全局标志的默认设置是 n,意味着“不提交”。

  • cfopen 将模式标志设置为 _fdopen

    专门使用 cn 标志打开的任何文件的行为以该标志为准,而不考虑全局提交/不提交标志的状态。

    如果你的程序未显式关闭流,则程序终止时流会自动关闭。 但是,你应在程序完成流操作时关闭流,因为可以同时打开的流的数量是有限。 请参阅 _setmaxstdio 了解有关此限制的信息。

    只有通过对 fflush 或对文件定位函数(fseekfsetposrewind)进行干预调用时,输入才能直接跟随输出。 如果输入操作遇到文件末尾,则输出可以在没有对文件定位函数进行干预调用的情况下跟随输入。

另请参阅

输入和输出
按类别分的运行时例程