明解C语言【中级篇】

明解C语言【中级篇】 学习记录

Chapter 09: 文件处理


前言

记录学习明解C语言【中级篇】的部分章节,作为知识总结,方便回阅翻看。


Chapter 9-1 标准流
本节结构:

在这里插入图片描述


流(stream)

  1. 定义

    	在C语言中,术语流表示任意输入的源或任意输出的目的地。
    	-----------------
    	解释:什么是源和目的地?
    				通过键盘输入,屏幕输出的小程序中,键盘和屏幕就是**流**,键盘就是输入的源,屏幕就是输入的目的地。
    
  2. 分类

标准流

文件指针默认含义
stdin标准输入键盘
stdout标准输出屏幕
stderr标准错误屏幕

备注:
文件指针:用于存放文件首地址的指针,用于对流进行访问。
stdin/stdout/stderr:它们是FILE *类型的对象,它们都是常量,分别指向键盘、显示器、显示器。默认配置情况下,c程序启动时,系统会自动打开这三个文件参照Linux系统】。


  1. 重定向
    既然std三重曲是默认情况,那么就对应有指定情况,即指定输入输出的文件,这便是:重定向
    输入自然就对应:输入重定向,输出自然就对应:输出重定向。
输入重定向输出重定向
标识符<>
案例demo <in.datdemo >out.dat
解释说明本质上是使得stdin流表示文件(这里是in.dat)而非键盘本质上是使得stdout流输出数据到out.dat文件中

系统默认
在这里插入图片描述

重定向
在这里插入图片描述


备注:
1:这里要注意的是:demo程序并不会意识到正在从文件in.dat中读取数据,它会认为从stdin获得的任何数据都是从键盘上录入的
2:输入重定向的比喻:比如我们常喝的特仑苏牛奶,公司注册地产的牛奶就是它的stdin,但其他子公司产的牛奶,就是它的重定向。除非特别关注产品说明,一般我们【即demo程序】只认该商品的名称:特仑苏。输出重定向亦是同理。


流与缓冲的关系?

如果有了解计算机的结构,我们都知道内存的访问速度是要优于硬盘的访问速度的。如果我们每次读写数据都是直接访问硬盘,那么速度将会大打折扣,当然这也是内存存在的意义之一。那么,我们先把读入读出数据存入内存中某些区域的过程就是缓冲,内存中的某些区域就是缓冲区域。具体详细过程,建议参考:深入理解计算机系统

形象的比喻:如果你家正在修房子,假设你用背篓去几十公里外的地方背建筑材料回来,让工人为你修建访问,工人估计耍爽了,那么这个速度就是直接从硬盘读取数据;但假如你请了一辆运输车过去,你把材料全部就地放在运输车上,拉回来给工人,那工人的材料就是处于管够的状态,在这里,运输车就是你的缓冲区,这个过程就是缓冲。那这里,其实就存在几点疑问?你这个车是多大的呢?如果只有一个工人的话,你需要缓冲吗?


缓冲的分类

  • 全缓冲:进行完整的缓冲

输入流输入:输入的字符被储存到缓冲区,当缓冲区存满时,把储存在缓冲区中的内容传送给程序。
输出流输出:输出的字符被储存到缓冲区,当缓冲区存满时,把储存在缓冲区的内容传送给外设。


  • 行缓冲:以行为单位进行缓冲

输入流输入:输入的字符被储存到缓冲区,当读取到换行字符或者缓冲区存满时,把储存在缓冲区中的内容传送给程序。
输出流输出:输出的字符被储存在缓冲区,当写入换行符或缓冲区存满时,把储存在缓冲区中的内容传送给外设。


  • 无缓冲:不进行缓冲

输入流输入:条件允许情况下,输入的字符就会从外设直接传递给程序。
输出流输出:条件允许情况下,输出的字符就会直接将内容输出到外设上。


针对这三种缓冲模式,自然就对应有缓冲切换函数(setvbuf/setbuf)
int setvbuf(FILE *stream, char *buf, int mode, size_t size)
void setbuf(FILE *stream, char *buf)

备注:只有在stream指向的流连接到已打开的文件,且对该流进行其他的操作前,才允许调用函数。实际参数mode像下面这样来指定对stream的缓冲方法。
mode:
_IOFBF…对输入输出进行全部缓冲
_IOLBF…对输入输出进行行缓冲
_IONBF…对输入输出不进行缓冲


fflush(stdout)函数
强制刷新(清空)缓冲区中堆积的未输出的字符

int fflush(FILE *stream)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值