分享

标准输入与Ctrl+D/Ctrl+Z

 学无涯_思无涯 2013-09-18

标准输入设备是行缓冲的,当从键盘上输入字符串,输入的字符串会首先被送到输入缓冲区中存储,当铵下回车键后才会去检测输入缓冲区中是否有了数据(也就是说fgets、fgetchar等函数这个时候才去从缓冲区中读数据)。我们可以把输入缓冲区理解为文件,那么对于这个文件来说,它也有结束的时候,输入函数在从缓冲区中读文件的时候也会去检测有没有流结束标志(EOF),这种标志是通过Ctrl+d 或 Ctrl+z产生的。Ctrl+d和Ctrl+z的检测主要分为两种:阻塞式 和 非阻塞式。

阻塞式: 指只有在按下回车键后才对之前是否有按下Ctrl+z进行检测。

非阻塞式: 指在按下Ctrl+d之后立即响应。

在非阻塞式模式下,按下Ctrl+d后立即响应,如果在此之前有输入字符,则Ctrl+d就相当于回车,即把输入的内容送到输入缓冲区供读取使用,此时Ctrl+d不作为流结束符使用,下次按下的Ctrl+d则作为流结束标志。如果按下Ctrl+d之前没有输入任何数据,刚Ctrl+d作为流结束标志,表示标准输入设备对应的文件结束。linux下输入就是非阻塞式的。

在Windows系统中输入一般采用阻塞式模式来对Ctrl+Z进行检测,在这种模式下,只有按下回车对会去检测之前有没有按下Ctrl+z,才会去检测流是否结束。那么就会有这样一个问题,就是在按下回车之前,输入缓冲区并不能检测到是否有Ctrl+z按下,所以即使按了Ctrl+z,照样还可以从键盘去输入内空,但是Ctrl+z这宾输入的内容到时候并不会被读取到,因为在缓冲区检测时,如果检测到Ctrl+z(结束标志),就会认为输入流结束了,那么后边的内容就不会被读进行,而被丢掉。

另外还有一点需要说明,就是Ctrl+z或Ctrl+d并不会产生一个普通的ASCII码值,也就是说它不会产生一个字符,不会被放到输入缓冲区中,所以大家也是读不到它的,那么可能有人会怀疑那我们时写的类似于这样的判断是怎么回事:

while(ch != EOF )

其实EOF就是一个复数(多数情况下就是-1),如果检测到输入流结束标志,则会让从键盘读取的函数返回值-1,这样就可以实现当文件结束时退出循环的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多