流 I/O
这些函数处理不同大小和格式的数据,从单个字符到大型数据结构都有。 它们还提供缓冲区,这样能提高性能。 流缓冲区的默认大小为 4K。 这些例程会仅影响由运行时库例程创建的缓冲区,对由操作系统创建的缓冲区不起作用。
流 I/O 例程
当程序开始执行时,启动代码将自动开启若干流:标准输入(由 stdin
指向)、标准输出(由 stdout
指向)和标准错误(由 stderr
指向)。 默认情况下,这些流将定向到控制台(键盘和屏幕)。 使用 freopen
将 stdin
、 stdout
或 stderr
重定向到磁盘文件或设备。
默认情况下,会对使用流例程打开的文件执行缓冲操作。 当 stdout
和 stderr
函数是完整的,或在进行了每次库调用之后要写入字符设备时,这两个函数将被刷新。 如果某个程序异常终止,则可能不会刷新输出缓冲区,从而导致数据丢失。 使用 fflush
或 _flushall
来确保将与指定文件关联的缓冲区刷新到操作系统,或刷新所有打开的缓冲区。 操作系统可以在将数据写入磁盘之前缓存数据。 提交到磁盘功能可确保刷新的缓冲区内容不会丢失(如果系统发生故障)。
有两种方法将缓冲区内容提交到磁盘:
与文件 COMMODE.OBJ 链接以设置全局提交标志。 全局标志的默认设置是
n
,意味着“不提交”。用
c
或fopen
将模式标志设置为_fdopen
。
专门使用 c
或 n
标志打开的任何文件的行为以该标志为准,而不考虑全局提交/不提交标志的状态。
如果程序未显式关闭流,则当程序终止时,该流会自动关闭。 但是,你应在程序完成流操作时关闭流,因为可以同时打开的流的数量是有限。 有关此限制的详细信息,请参阅 _setmaxstdio
。
只有通过对 fflush
或对文件定位函数(fseek
、 fsetpos
或 rewind
)进行干预调用时,输入才能直接跟随输出。 如果输入操作遇到文件的末尾,则输入可以后跟输出,而无需对文件定位函数进行干预调用。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈