2016-11-11 1 views
1

私はコマンドラインからC++実行ファイルを実行するRailsアプリケーションを持っています。私はコマンドラインにC++ coutを印刷することができますが、それを変数、つまりコントローラの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

多分この1つです:http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby?しかし、とにかくこれは悪いデザインかもしれないと思うかもしれませんし、あなたはルビーにCの関数をラップするswigのようなRPCまたはCからRubyラッパーを見たいかもしれません。 – lz96

+0

もう1つの解決策は、Railsでリスナーソケットを作成してから、このソケットにデータを送信することです。 –

答えて

0

私が考えたベストアイデアは、C++アプリケーションを実行して、レールに入力したもの(|)を入力して$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

だろうあなたはパイプを使用してプログラムの開発の出力をキャプチャすることができます。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

あなたがバックを使用することができますがルックでのコマンドライン実行の出力をキャプチャするための、括弧つき演算子です。

irb(main):008:0> x = `echo foo` 
=> "foo\n" 
関連する問題