Windows 下EOF 和 Linux 下EOF的区别

由于C++作业在Windows下 用VS写的,提交作业要用Linux测试,出现了一些问题。

经过查阅,发现Windows 和 Linux下EOF指令的一些区别,在这里记录一下,如有理解不当的地方请指正哈。


主要参考博主爱若一生的文章http://blog.csdn.net/cwj649956781/article/details/7327937


EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get()    就会检测输入缓冲区中是否有了可读的数据。cin.get()    还会对键盘上是否有作为流结束标志的    Ctrl+Z    或者    Ctrl+D    键作出检查。

检测EOF的方式有两种:阻塞式和非阻塞式。


阻塞式只在按下回车后才检测之前是否有Ctrl + Z 是否按下(Windows一般采用阻塞式,Ctrl + Z表示EOF)。如果先输入了一些字符,没有回车换行重新输入Ctrl+Z,那么输入缓冲区由于存在其他的可读数据,从而不会检测到Ctrl+Z(因为有要读的数据,所以不能认为到了文字流的末尾)。所以,若想在windows下正确执行EOF,必须新的一行只输入Ctrl+ Z指令。


Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区。   


例如,从键盘上输入abcd^z  ,再回车之后在Windows系统上是这样处理的:由于回车的作用,前面的  abcd    等字符被送到输入缓冲区(注意:上面说过了,^z不会产生字符,所以更不会存储到输入缓冲区,缓冲区中没有   ^z   的存在)。这时,cin.get()    检测到输入缓冲区中已经有数据存在(因此不再检查是否有    ^z    的输入),于是从缓冲中读取相应的数据。如果都读取完了,则输入缓冲区重新变为空,cin.get()    等待新的输入。可见,尽管有    ^z    按下,但是由于在此之前还有其它输入(abcd),所以流也不会结束。


非阻塞式 是指按下   Ctrl 的组合键  之后立即响应的方式(Unix / Linux 一般采用非阻塞式, Ctrl + D 表示EOF)。如果先输入了一些字符,未换行直接输入 Ctrl + D,需要再次输入Ctrl + D 才可以正常EOF。当终端有字符输入时,Ctrl+D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符输入或者可以说当getchar()读取新的一次输入时,输入Ctrl+D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值