2014-10-29 82 views
0

我需要做這樣的事情。我如何將字符串重定向到紅寶石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(:+) 

有沒有什麼辦法來解決這一問題?

+0

你究竟在做什麼? – daremkd 2014-10-29 12:37:14

+0

我想實現分級系統,通過給它們輸入來測試程序,並檢查輸出是否匹配。 – iboss 2014-10-29 12:47:06

回答

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

也許還有一個更簡單的方法,但如果你不介意產卵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 

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