enter&IOError:字符缓冲IO的字节读取

在一个答案中,我发现这个节等待您的输入并打印它直到您按Enter键:

require 'io/console' require 'io/wait' loop do chars = STDIN.getch chars << STDIN.getch while STDIN.ready? # Process multi-char paste break if chars == ?\n STDOUT.print chars end 

但是,为了退出loop ,我必须按“Enter”(新行的键 – \n )两次,或者按下其后的其他内容。
当我尝试再次执行相同的循环(将其复制粘贴到相同的pry会话中)时,我得到:

 IOError: byte oriented read for character buffered IO 

chars << STDIN.getch while STDIN.ready? 导致提高,如上所述,错误。 如果没有这一行,ruby就不会显示任何错误。

在这两种情况下(有和没有上面的行),在循环中:

  • 当我按下输入然后按一些字母(例如’z’)时,我收到了这个错误。
    在下一个循环中,上面的字母将显示(没有我的输入)。

  • 当我按两次输入 – 没有错误时,它将退出。
    在我按下某个字母的下一个循环中,将显示错误。
    在上面的下一个循环中将显示字母

我记得在C或C ++中有flush所以你可以清空缓冲区。 我找到了一些方法,并尝试这样:

  loop do STDIN.ioflush STDOUT.ioflush STDOUT.iflush STDIN.iflush STDOUT.oflush STDIN.oflush chars = STDIN.getch chars << STDIN.getch while STDIN.ready? break if chars == ?\n STDOUT.print chars end 

但它不起作用。

如何使用enter和2nd letterIOError解决此问题。 我认为两者在某种程度上是相关的。

该答案的代码是我为个人使用而编写的类似高线的库的简化版本。 我自己从未遇到过这个特定的错误,但可能是因为我实际上使用了一些略有不同的东西。 我的实际代码更像是这样的:

 require 'io/console' require 'io/wait' catch(:done) do loop do chars = STDIN.getch chars << STDIN.getch while STDIN.ready? # Process multi-char paste throw :done if ["\r", "\n", "\r\n"].include?(chars) STDOUT.print chars end end STDOUT.print "\n" 

我也有kill-signal处理程序,以防Ctrl + C(kill process)或Ctrl + D(输入结束)被按下; 第一个中断程序,第二个连线响应就好像输入被按下一样。

精确的行为可能取决于操作系统(我在OSX和FreeBSD上使用它),因为输入键可以返回任何"\r""\n""\r\n"具体取决于操作系统:

\ r \ n,\ r,\ n它们之间有什么区别?