admin管理员组文章数量:1613755
由于C++作业在Windows下 用VS写的,提交作业要用Linux测试,出现了一些问题。
经过查阅,发现Windows 和 Linux下EOF指令的一些区别,在这里记录一下,如有理解不当的地方请指正哈。
主要参考博主爱若一生的文章http://blog.csdn/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()的执行。
版权声明:本文标题:Windows 下EOF 和 Linux 下EOF的区别 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728657485a1168326.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论