2014-01-17 2 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 

배쉬로 다시 프로그램의 결과를 전달하는 쉬운 방법이 있나요 스크립트? 나에 대해 종료 코드를 사용하여 읽었지만, 반환 형식이 이중이므로 작동하지 않을 것이라고 생각합니다. 프로그램이 다른 터미널 출력을 가지고 있기 때문에 문자열 출력에서 ​​값을 파싱하는 것은 어렵습니다.

+1

cout << 결과; ? – 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

"문자열 출력에서 ​​값을 파싱하는 것은 프로그램에 다른 터미널 출력이 있기 때문에 다루기 힘듭니다." –