了解缓冲区

从一段代码入手

先来观察一下下面的代码:

int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

这是很简单的一段代码,代码功能是从缓冲区中读取输入,如果不为EOF,
再将输入内容输出。

EOF是文件结束标志(end of file),如果想给程序一个EOF的指令,就要从键盘按下Ctrl + z


提示:以下是本篇文章正文内容,下面案例可供参考

一、没事儿走两步

我们先来观察一下程序是否能按照我们预想的那样输出:

在这里插入图片描述
完了,出问题了,按照我们预想的那样输入EOF后程序就结束了,为什么我们输入EOF不能结束,反而又打印出来了呢?why?

要想知道这个问题形成的原因,我们首先要了解缓冲区。

二、缓冲区

1.什么是缓冲区

缓冲区又称为缓存,它是内存空间的一部分。也就是说,内存空间中预留了一定的存储空间,这些存储空间呢是用来缓冲输入的数据和输出的数据,这部分预留的空间就被称作缓冲区。

缓冲区有两种,根据其对应的是输入设备还是输出设备
分为:输入缓冲区,输出缓冲区

2.缓冲区的作用

大家可能有疑问,我们输入或者输出数据的时候,直接从相应存储位置读取或者输入就好了,为什么还要引入缓冲区呢?

打个比方说,我们从磁盘里读取信息,我们会先把读取到的数据放在缓冲区内,由计算机再从缓冲区内读取数据信息,等缓冲区的数据读取完毕或者将要读取完毕,这时再从磁盘中去读取数据到缓冲区内。

这样就可以减少磁盘的读写次数,另外一个重要的原因就是读取数据的速度问题,磁盘访问速度相较于cpu是非常慢的,如果直接从磁盘读取会让计算机运行速度变得缓慢,而cpu读取缓存的速度要比磁盘快得多,所以说,使用缓冲区会大大提高计算机的运行速度。

所以说,缓冲区处在输入输出设备和cpu之间,用来缓存数据。它的存在能使得低速的输入输出设备和高速的cpu能够协调工作,避免速度较低的输入输出设备占用较长时间的cpu资源,就能解放cpu,使其能够高效的工作。

3.回到上面的那段代码

代码如下:

int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

为什么它不能按照我们预想的那样输出呢?EOF不是能够结束吗?为什么还会再次输出呢?我知道大家现在仍然很困惑,那我们现在就结合缓冲区来分析一下这个代码。
在这里插入图片描述
我们结合这个例子来分析一下,大家可以发现,前六行正是按照我们预想的那样输出的,但是第七行我们想要结束它的时候却出了问题。

这是因为当我们输入一行字符,并敲下回车的时候,它就会被输入到缓冲区内,紧接着就会把缓冲区内的内容输出(同时也包括回车所带来的换行)。

紧接着,我又输入了几个字符,但是这时候我不想再输入了,我想把这个程序停止,于是输入了EOF对应的内容,然后敲下回车。

此时当我敲下回车后,我之前输入的内容都被送到了缓冲区内,虽然我输入了EOF想让它停下来,但是缓冲区在发现EOF之前还又内容时,就会忽略掉EOF,如果想让其正确执行,就应该在缓冲区为空时输入EOF。

如下:
在这里插入图片描述
这时我们的程序就按照想我们预习的那样终止了!

总结

这是我自己的一点小理解,大家有问题欢迎在评论区讨论呀!

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值