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&quot"(新行 - n)两次,或者在其之后按其他内容。
当我尝试再次执行相同的循环时(复制将其放入同一pry会话)时,我会得到:

IOError: byte oriented read for character buffered IO

chars << STDIN.getch while STDIN.ready?导致上述升高,错误。没有这条线,Ruby只是不会显示任何错误。

在两种情况下(有和没有上线),在循环中:

  • 当我按ENTER时,然后一些字母(例如'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和第二个字母&amp;IOError。我认为两者都以某种方式相关。

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

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", "rn"].include?(chars)
    STDOUT.print chars
  end
end
STDOUT.print "n"

我也有杀戮信号处理程序,以防CTRL C(杀死过程)或Ctrl D(输入的结尾)被按下;第一个中断程序,第二个打断了以像按下Enter一样反应。

确切的行为可能取决于OS(我在OSX和FreeBSD上使用),因为Enter键可以根据OS返回"r""n""rn"的任何一个:

r n, r, n它们有什么区别?

最新更新