如何在ruby中将字符串重定向到stdin

时间:2014-10-29 12:34:03

标签: ruby stdin

我需要做这样的事情。

10.times do |i|
    file = File.open("./data/#{i+1}.in")
    $stdin = file.read
    load 'sum.rb'
    file.close
end

这是sum.rb

gets.chomp.split().map { |e| e.to_i }
puts array.inject(:+)

有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:2)

$stdinFile.open的结果都是IO个对象,因此,不是将file.read的结果分配给$stdin,而是指定file本身。

10.times do |i|
    file = File.open("./data/#{i+1}.in")
    $stdin = file
    load 'sum.rb'
    file.close
end

这将解决您的直接问题,sum.rb将无法正常工作(array未在任何地方定义。)

在更强大的版本中,您可能希望保留$stdin的原始值并在完成后重置它。

答案 1 :(得分:1)

也许有一种更简单的方法,但如果你不介意将sum.rb生成为一个新进程(可以更好地模拟测试),你可以这样做:

require "open3"

10.times do |i|
  File.open("./data/#{i+1}.in") do |file|
    Open3.popen2e("ruby sum.rb") do |stdin, stdout, wait_thr|
      stdin.puts(file.read)
      exit_status = wait_thr.value # Process::Status object returned.
    end
  end
end

Doc:http://ruby-doc.org/stdlib-2.1.0/libdoc/open3/rdoc/Open3.html#method-c-popen2e