由于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的区别
发布评论