标准I/O中基础知识积累

标准I/O在拥有C库的操作系统中都可以调用,所以拥有良好的可移植性。与之前的文件相比,标准I/O更少使用系统调用,原因是标准I/O在用户空间先行创建缓冲区,执行读写操作时先操作缓冲区,最后再访问要被执行的文件。
ANSIC进一步对I/O的概念进行了抽象。就C程序而言,所有的I/O操作只是简单地从程序移进或移出字节的事情(它将数据的输入输出看作是数据的流入和流出)。这种字节流便被称为流(stream)。流入程序的流称为输入流,流出程序的流称为输出流。类比于生活中的水流,水流可以流入碗中,也可以从碗中流回到水流中。这里的水流就是文件流,流入碗中的过程就是文件输入的过程,流回到水流中的过程就是文件输出的过程。标准I/O操作都是基于流来进行各种操作的。
每当通过标准I/O打开一个文件时,就会返回一个文件描述符,我们就要创建一个FILE结构体去接收,这个FILE结构体就是我们所说的流。


流的分类分为文本流和二进制流两种:
文本流:在流处理过程中所有数据以字符形式出现,'\n'被当做回车符CR和换行符LF两个字符处理,即'\n'ASCII码存储形式是0x0D和0x0A。当输出时,0x0D和0x0A转换成'\n'
二进制流:在流处理过程中把数据当做二进制序列,若流中有字符则把字符当做ASCII码的二进制数表示。'\n'不进行变换。
例如:2018在文本流中和二进制流中的数据类型不同:
文本流:2018—->’2”0”1”8’—->50 48 49 56 共占4字节。
二进制流:2018–>数字2018—>00000111 11100010 用十六进制就是07E2只占两字节。
由此看出,二进制流比文本流节省空间,且不用进行对\n的转换,这样可以大大加快流的速度,提高效率。因而,对于含有大量数字信息的数字流,可以采用二进制流的方式;对于含有大量字符信息的流,则采用文本流的方式。


每当一个进程被启动的时候,系统会自动打开3个流:标准输入、标准输出、标准出错。

标准输入0STDIN_FILENOstdin
标准输出1STDOUT_FILENOstdout
标准出错2STDERR_FILENOstderr

标准IO函数是根据文件流关联的设备类型,会选择采用何种缓冲区的操作方式。分类如下:
1)全缓冲区:这种缓冲区要求填满整个缓冲区后才进行I/O 系统调用操作。对于磁盘文件通常使用全缓冲区访问。第一次执行I/O 操作时,ANSI 标准的文件管理函数通过调用malloc函数获得需使用的缓冲区。Linux中默认大小为4096。
2)行缓冲区:在这种情况下,当在输入和输出中遇到换行符时,执行I/O系统调用操作。当流涉及一个终端时(例如标准输入和标准输出),使用行缓冲区。因为标准I/O 库每行的缓冲区长度是固定的,只要填满了缓冲区,即使还没有遇到换行符也将执行I/O 系统调用操作。默认行缓冲区大小为1024 字节。
3)无缓冲区:标准I/O 库不对字符进行缓存,即对流的读写操作会立即操作实际文件。很多的人机交互界面要求不可全缓存。标准出错流stderr 通常是不带缓冲区的,这使得出错信息能够尽快地显示出来。
每当进程结束就会默认刷新缓冲区。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值