我正在编写一个程序,该程序执行另一个用c编写的程序,这是我的第一次尝试
require 'Open3'
system 'tcc temp.c'
Open3.popen3('temp.exe') do |stdin, stdout, stderr|
stdin.puts '21n'
STDOUT.puts stdout.gets
end
实际输出:
Enter the temperature in degrees fahrenheit: The converted temperature is -6.11
期望的输出:
Enter the temperature in degrees fahrenheit: 21
The converted temperature is -6.11
如果你知道更好的方法,请告诉我,我是Ruby的新手。
您似乎至少有两个潜在问题:
- 换行符不会在单引号内展开。要在字符串中包含换行符,您需要使用双引号,例如
"21n"
。 - 在某些情况下,您实际上需要回车符而不是换行符。当尝试使用终端执行类似 Expect(类似 Expect)的事情时尤其如此。例如,您可能会发现字符串中需要
r
而不是n
。
您肯定需要修复第一件事,但您可能还需要尝试第二件事。这绝对是"您的里程可能会有所不同"的情况之一。
似乎您希望21
出现在屏幕上,因为当您运行temp.exe
并键入21
时,它会出现。在这种情况下,它出现在屏幕上的原因是您将它们键入到shell中,这会"回显"您键入的所有内容。
但是,当您通过 Ruby 运行程序时,没有 shell 和键入,因此即使它被正确发送到程序的标准输入,21
也不会出现在屏幕上。
最简单的解决方案非常简单。只需将其写入 Ruby 的标准输出:
require 'Open3'
system 'tcc temp.c'
Open3.popen3('temp.exe') do |stdin, stdout, stderr|
STDOUT.puts "21"
stdin.puts '"21"
STDOUT.puts stdout.gets
end
(你会注意到我拿出了n
- IO#puts
为你补充了它。
不过,这有点重复。您可以定义一个简单的方法来为您处理它:
def echo(io, *args)
puts *args
io.puts *args
end
然后:
Open3.popen3('temp.exe') do |stdin, stdout, stderr|
echo(stdin, "21")
puts stdout.gets
end