2016-11-11 51 views
1

我有一個從命令行運行C++可執行文件的Rails應用程序。我可以將C++ cout打印到命令行,但我想將它分配回Rails控制器中的變量output =如何將C++可執行文件的值傳遞給Rails應用程序?

這可能嗎?

下面是我的Rails控制器操作和C++ .cpp的簡化示例,以幫助解釋該問題。

Rails的控制器:

def get_variable 
    system("cd ~/workspace/OutputTest/src && ./output.bin") 
end 

注意我已經編譯和創建了一個名爲output.bin一個C++的可執行文件。

C++文件:

#include <iostream> 
using namespace std; 

int main() { 
    cout << "Hello world!!!"; 
    return 0; 
} 

我熟悉Rails的(不一定是從運行的Rails通過在命令行中的文件),但一個完整的福利局到C++。

任何指導將非常感激。如果還有另一種方法,我應該完全採取,這也是非常有用的知道。

我寧願不要這樣做,因爲我想在C++中做更多的事情,一旦我可以解決這個初始步驟。


UPDATE

最好的解決辦法,我拿出這麼遠在C++寫一個字符串轉換爲.txt,然後使用Rails中File.read()。但它不感覺可伸縮,或者在數據結構上給予靈活性。

所以我仍然想知道是否有更直接的方式,比如保存Rails訪問它的內存值。但不知道。

+0

也許這一個:http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby?但無論如何,我認爲這可能是一個糟糕的設計,你可能想看看RPC或C到Ruby的包裝器,如swig,它將C函數包裝成ruby。 – lz96

+0

另一種解決方案可能是在Rails中創建偵聽器套接字,然後從C++發送數據到此套接字 –

回答

0

我想到的最好的想法是運行C++應用程序,管道(|)輸入到rails(如果有效的話)和做$stdin.gets()。我不是一個紅寶石專家,我沒有使用它,但我認爲它應該工作。嘗試

./cppapp | rubyapp 

在bash終端上。

2

也許你已經試過了,但ruby中有一個反引號操作符,它以字符串形式返回命令的輸出。

例如:

def system_date 
    `date` 
end 
puts system_date #=> "Wed Nov 16 18:59:28 CET 2016" 

你的情況這將是

def get_variable 
    `~/workspace/OutputTest/src/output.bin` 
end 
+0

我同意反引用是解決此問題的不錯選擇。我只是讓你的代碼遵循常見的Ruby成語(刪除了不需要的'return'和空括號) – spickermann

0

您可以捕捉您PROGRAMM的輸出與管道:

測試。CPP:

#include <iostream> 

int main() { 
    std::cout << "Hello world!!!"; 
    return 0; 
} 

編譯:$ g++ test.cpp -o hello

test.rb:

var = IO.popen("./hello") do |cmd| 
    cmd.read 
end 

puts var 

#=> "Hello world!!!" 
關於管閱讀

更多信息可以在文檔中找到:IO.popen

0

您可以使用後臺tick運算符來捕獲ruby中命令行執行的輸出。

irb(main):008:0> x = `echo foo` 
=> "foo\n" 
相關問題