0

私は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

それを行うためのより良い方法を知っている場合は、教えてください。私はルビーが初めてです。

4

2 に答える 2

1

少なくとも 2 つの潜在的な問題があるようです。

  1. 改行は一重引用符内では展開されません。文字列内に改行を含めるには、 などの二重引用符を使用する必要があります"21\n"
  2. 場合によっては、実際には改行ではなくキャリッジ リターンが必要になります。これは、端末で Expect のようなことをしようとする場合に特に当てはまります。たとえば、文字列\rの代わりに必要な場合があり\nます。

間違いなく最初のものを修正する必要がありますが、2 番目のものも同様に試す必要があるかもしれません。これは間違いなく、「走行距離が異なる場合がある」状況の 1 つです。

于 2016-02-22T00:08:52.943 に答える
1

を実行して入力21すると画面に表示されるため、画面に表示されることを期待しているようです。このような状況で画面に表示されるのは、シェルにそれらを入力しているためです。シェルは、入力したすべてを「エコー」します。temp.exe21

ただし、Ruby 経由でプログラムを実行すると、シェルもタイピングも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—<code>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
于 2016-02-22T00:49:49.720 に答える