搜索
查看: 2949|回复: 22
打印 上一主题 下一主题

怎么清除EOF?

[复制链接]
跳转到指定楼层
#
发表于 2014-3-16 16:47:59 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
5啊哈币
如题,请给出C和C++两种方案
(C++):cin.clear()还不够,cin的错误标志被清除了,但仍不能接受输入。

22#
发表于 2014-9-8 11:33:07 | 只看该作者
981013 发表于 2014-9-8 11:30
也就是说在Mac OS上终端记住了EOF,然后在clearerr之前都不能正常读取?

是的
另外文档下面标着BSD,说明在BSD系统中应该都是这样

另,现在没有Mac OS,只有OS X
21#
 楼主| 发表于 2014-9-8 11:32:50 | 只看该作者
论坛出毛病了,发的时候说内部错误,结果发了三遍
20#
 楼主| 发表于 2014-9-8 11:30:46 | 只看该作者
rosynirvana 发表于 2014-9-7 21:58
当时的回复有个地方不怎么确定,这个问题其实可以比照一下OSX和Linux的man page

OSX getchar (3)

也就是说在Mac OS上终端记住了EOF,然后在clearerr之前都不能正常读取?
19#
 楼主| 发表于 2014-9-8 11:30:36 | 只看该作者
rosynirvana 发表于 2014-9-7 21:58
当时的回复有个地方不怎么确定,这个问题其实可以比照一下OSX和Linux的man page

OSX getchar (3)

也就是说在Mac OS上终端记住了EOF,然后在clearerr之前都不能正常读取?
18#
 楼主| 发表于 2014-9-8 11:30:30 | 只看该作者
rosynirvana 发表于 2014-9-7 21:58
当时的回复有个地方不怎么确定,这个问题其实可以比照一下OSX和Linux的man page

OSX getchar (3)

也就是说在Mac OS上终端记住了EOF,然后在clearerr之前都不能正常读取?
17#
发表于 2014-9-7 21:58:50 | 只看该作者
当时的回复有个地方不怎么确定,这个问题其实可以比照一下OSX和Linux的man page

OSX getchar (3)
The end-of-file condition is remembered, even on a terminal, and all subsequent attempts to
     read will return EOF until the condition is cleared with clearerr(3).

https://developer.apple.com/libr ... man3/getchar.3.html

linux getchar (3)
http://man7.org/linux/man-pages/man3/getchar.3.html

没有强调terminal会记住EOF的状态
16#
发表于 2014-3-23 16:02:03 | 只看该作者
简单的对应方法
  1. #include <stdio.h>

  2. int main()
  3. {
  4.   while(1){
  5.     int ch;
  6.     ch = getchar();
  7.     if(ch != EOF)
  8.       printf(" %d\n", ch);
  9.     else
  10.       clearerr(stdin);
  11.   }
  12.   return 0;
  13. }
复制代码


可能在libc或者系统接口上OS X和Linux的实现有点不同
15#
发表于 2014-3-23 15:52:33 | 只看该作者
981013 发表于 2014-3-23 15:20
是bash
不过一般用的是xCode的虚拟终端

确实是个问题,让我研究研究看看
14#
 楼主| 发表于 2014-3-23 15:20:09 | 只看该作者
rosynirvana 发表于 2014-3-23 15:08
你在OS X下面用的是哪个shell? bash还是其他的? 我去试试看

是bash
不过一般用的是xCode的虚拟终端
13#
发表于 2014-3-23 15:08:41 | 只看该作者
981013 发表于 2014-3-23 15:07
就是不停输出-1

你在OS X下面用的是哪个shell? bash还是其他的? 我去试试看
12#
 楼主| 发表于 2014-3-23 15:07:05 | 只看该作者
rosynirvana 发表于 2014-3-23 14:54
没明白,那段本来就是死循环啊?

就是不停输出-1
11#
发表于 2014-3-23 14:54:14 | 只看该作者
981013 发表于 2014-3-23 14:48
Mac OS (UNIX)下这段代码就死循环了其他系统下都没问题

没明白,那段本来就是死循环啊?
10#
 楼主| 发表于 2014-3-23 14:48:31 | 只看该作者
rosynirvana 发表于 2014-3-21 21:28
首先,和系统处理回车的方式无关
测试代码

Mac OS (UNIX)下这段代码就死循环了其他系统下都没问题
9#
发表于 2014-3-21 23:02:01 | 只看该作者
本帖最后由 rosynirvana 于 2014-3-21 23:31 编辑

然后是linux下的测试

linux下在同一行输入ctrl+d,会刷新缓冲区
在新一行输入ctrl+d,会输入一个EOF

和上面相同的测试代码
输入
1
输出
49
10
输入
2
输出
50
10
输入
ctrl+d
输出
-1
输入
2ctrl+d
整体效果
2 50
换而言之就是自动补充了一个回车来换行
测试原始的代码,在2后面输入ctrl+d什么都不会发生,interesting
8#
发表于 2014-3-21 21:28:02 | 只看该作者
本帖最后由 rosynirvana 于 2014-3-21 21:35 编辑

首先,和系统处理回车的方式无关
测试代码
  1. #include <stdio.h>

  2. int main()
  3. {
  4.   while(1){
  5.     int ch;
  6.     ch = getchar();
  7.     printf(" %d\n", ch);
  8.   }
  9.   return 0;
  10. }
复制代码


输入
1
显示
49
10

输入
2
显示
50
10
所以程序认为缓冲区中只有\n

然后输入
2ctrl+z
显示
50
26

输入
ctrl+z
显示
-1

EOF在大多数编译环境中的定义是-1

所以可以看到,只有在新一行输入ctrl+z,才会被认为是EOF信号,而同一行则不会

同样,最初的那份代码,如果正确地在新一行输入ctrl+z是不会有问题的,如果在同一行输入就会造成残留字符

看来windows下是这个问题

unix……嗯让我先把raspberry刷一遍再去测试XD
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表