我正在编写一个执行用c编写的其他程序的程序,这是我的第一次尝试
require 'Open3'
system 'tcc temp.c'
Open3.popen3('temp.exe') do |stdin, stdout, stderr|
stdin.puts '21\n'
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的新手。
答案 0 :(得分:1)
您似乎至少有两个潜在问题:
push_back
。"21\n"
而不是\r
。你肯定需要修复第一件事,但你也可能需要尝试第二件事。这肯定是“你的里程可能会有所不同”的情况之一。
答案 1 :(得分:1)
您似乎希望21
出现在屏幕上,因为当您运行temp.exe
并输入21
时,它就会出现。在这种情况下它出现在你的屏幕上的原因是你要在你的shell中输入它们,然后回复"支持你输入的所有内容。
但是当你通过Ruby运行程序时,没有shell而且没有输入,所以即使将21
正确发送到屏幕上,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
也不会显示在屏幕上该计划的标准输入。
最简单的解决方案非常简单。只需将其写入Ruby的标准输出:
\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
然后:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(CLIENT_ID)
.requestEmail()
.build();