2014-01-17 12 views
5

私は、ダブル結果を計算するC++プログラム(Linux上)を用意しています。プログラムをさまざまな回数実行し、これらの結果を平均化するbashスクリプトを作成します。私。簡単にするために、次のコードを考えてみます。C++プログラムからbashスクリプトに値を戻す

main.cppに:

int main() { 
    cout << "Some other stuff\n"; 

    double result = foo(); 

    return 0; 
} 

script.sh:

sum = 0 
num = $1 
for((i = 0; i < $num; i++)); do 
    result = ./a.out; #store the result somehow? 
    sum = $sum + $result 
done 
avg = $sum/$num 
echo "Average: " $avg 

はbashに戻すプログラムの結果を渡すための簡単な方法がありますスクリプト?私は終了コードの使用について読んでいますが、戻り値の型はdoubleなので、うまくいくとは思いません。プログラムが他の端末出力を持っているため、文字列出力から値を解析するのは扱いにくいです。

+1

cout << result; ? – neagoegab

+0

戻りコードは整数でなければなりません。周囲には戻りません。特殊なファイルに結果を書き込んだり、このファイルをbashで読むことができます。 – akhikhl

+1

Unix環境でプログラム間でデータをやり取りする標準的な方法は、標準出力と標準入力によるものです。出力を印刷します。 –

答えて

9

これを行うUNIXの方法は、stderrに重要でないデータを書き込み、stdoutに実際の結果を書き込むことです。その方法は、あなたは、単に

int main() { 
    cerr << "This is output that won't be captured." << endl; 
    cout << "3.141592" << endl; 
} 

を行い、それをキャプチャするコマンド置換を使用することができます。

result=$(./a.out) 

出力は別のファイル記述子に書き込むことです変更する必要がないことをやっての醜い方法:

result=$(./a.out 42>&1 > /dev/null) 

int main() { 
    char* foo = "3.141592\n"; 
    write(42, foo, strlen(foo)); 
} 

これは、あなたがして出力をキャプチャできるようになります

シェルスクリプトにはいくつかの構文エラーがあります。 shellcheckを試して、それらの多くを自動的に整理し、解決できない問題について質問を投稿してください。

+1

"プログラムには他の端末出力があります。" – akhikhl

+0

@akhikhlありがとうございました! –

+0

ありがとう!コマンドライン引数を使用して、バッチファイル出力と冗長な端末出力を切り替える方法を説明しました。 – donnyton

3

bashスクリプトのデータとして戻り値を使用しないのはなぜですか?次のように

int main() { 
     return 46; 
} 

出力は(はい、それはbashスクリプトです)です:あなたは、このアプローチを使用することができ、二重の値の場合は

./a.out ; echo $? 
46 

#include <iostream> 

int main() { 
     double res = 46.001; 
     std::cout << res << std::endl; 
     return 0; 
} 

そして出力:

a=`./a.out`; echo $a 
46.001 
+0

残念ながら、これは8ビット整数に制限されており、ダブルドンニットンが復帰したいとは思えません。 –

+0

"プログラムが他の端末出力を持っているため、文字列出力から値を解析するのが難しいです。" –

関連する問題