您当前的位置:首页 > 计算机 > 编程开发 > C语言

对C语言输入输出流的深入理解

时间:01-03来源:作者:点击数:

流(stream)是一个很抽象的概念,《C程序设计语言》中这样定义:流与磁盘或其它外围设备关联的数据的源或目的地。

在Unix/Linux中,文本流和二进制流是相同的,但在Windows中,稍有差异,所以C标准库提供了这两种类型的流。

文本流是由文本行组成的序列,每一行包含0个或多个字符,并以'\n'结尾。在某些环境中, 可能需要将文本流转换为其它表示形式(例如把'\n'映射成回车符和换行符),或从其它表示形式转换为文本流。

二进制流是由未经处理的字节构成的序列,这些字节记录着内部数据, 并具有下列性质:如果在同一系统中写入二进制流,然后再读取该二进制流,则读出和写入 的内容完全相同。

在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备都被映射成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。 

不同文件对应的硬件设备
文件 硬件设备
stdin 标准输入设备(键盘);scanf()、getchar() 等函数从 stdin 获取输入。
stdout 标准输出设备(显示器);printf()、putchar() 等函数向 stdout 输出数据。
stderr 标准错误输出设备(显示器);perror() 等函数向 stderr 输出数据。
stdprn 标准打印设备(打印机)。
stdaux 标准辅助输入输出设备(异步串行口)。

打开一个流,将把该流与一个文件或设备连接起来,关闭流将断开这种连接,打开一个文件将返回一个指向FILE结构体类型的指针,该指针记录了控制该流的所有必要信息,在不引起歧义的情况下,我们在下文中将不再区分“文件指针”和“流”。

程序开始执行时,默认会打开 stdin、stdout和stderr三个文件,所以我们使用 scanf()、printf() 等函数时就不需要再使用 fopen() 显式打开这些文件。

C语言打开文件时,先将文件内容载入缓冲区(缓存),并返回一个指向FILE结构体的指针,接下来对文件的操作,都映射成对缓冲区的操作,只有当强制刷新缓冲区、关闭文件或程序运行结束时,才将缓冲区中的内容更新到文件。就像编辑word文档,并不是立刻将编辑好的内容写入到磁盘上的文件,而是对缓存中的副本进行操作,只有当保存文件时,才将副本同步到磁盘上的文件。

缓冲区有很多类型,我们这里指的缓冲区是主存(内存条)上的一块特殊区域,专门用来缓存数据,供程序读写。

而由于硬件不同,将缓冲区的内容同步到文件的过程可能比较繁杂,不易操作,这些都由操作系统完成,对编程人员不可见,编程人员只要能操作接口简单的缓冲区即可。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门