C++でPOSIXコマンドを実行して出力を取得する方法
C++のプログラム内からPOSIXコマンドを実行したい場面は少なくありません。実はその方法は非常にシンプルで、標準ライブラリが提供する system() 関数を使うだけで実現できます。この関数に文字列としてコマンドを渡すと、シェルを介してそのPOSIXコマンドが実行されます。
system() 関数の基本構文
system("command")引数には実行したいコマンドを表す文字列を渡します。戻り値として、コマンドの終了ステータスが返されます(正常終了時は一般的に 0 が返ります)。
サンプルコード
以下は、echo コマンドで文字列を出力し、bc コマンドで数式を計算する例です。
#include <iostream>
using namespace std;
int main() {
cout << "echoコマンドで文字列を出力" << endl;
system("echo 'Hello World'");
cout << "bcコマンドで数式を計算" << endl;
system("echo '22 / 7' | bc -l");
return 0;
}実行結果
echoコマンドで文字列を出力 Hello World bcコマンドで数式を計算 3.14285714285714285714
補足:出力をC++側で取得したい場合
system() はコマンドの出力を直接コンソールに表示するだけで、プログラム内で結果を受け取ることはできません。コマンドの出力をC++の変数として取得したい場合は、POSIXの popen() 関数を使用します。
#include <cstdio>
#include <iostream>
#include <string>
int main() {
FILE* pipe = popen("echo 'Hello from command'", "r");
if (!pipe) return 1;
char buffer[128];
std::string result;
while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
result += buffer;
}
pclose(pipe);
std::cout << result << std::endl;
return 0;
}注意点
- セキュリティリスク:
system()にユーザー入力などをそのまま渡すと、コマンドインジェクションの危険があります。外部入力は必ず検証・エスケープしてください。 - 移植性:
system()はC++標準ライブラリ(<cstdlib>)に含まれますが、実際に実行されるコマンドは環境依存です。LinuxやmacOSなどのUNIX系環境を想定してください。 - 終了ステータスの確認: 戻り値をチェックすることで、コマンドが正常に完了したかどうかを判定できます。
このように、system() を使えばC++から手軽にシェルコマンドを実行できます。出力の取得が必要なケースでは popen() の活用も検討してみてください。
-
C++とOpenCVを使って線を描画する方法
OpenCVで線を描画するには、始点と終点の2つの座標が必要です。さらに、線を描くためのキャンバス(描画領域)も用意しなければなりません。線を描画するために必要な要素OpenCVでは、キャンバスとして機能するのが行列(Mat)です。この行列に対して、線の始点と終点を定義し、加えて以下の情報も指定します。線の色線の太さつまり、OpenCVで線を描くには、行列・2つの点・色・線の太さという4つの要素を宣言しておく必要があります。必要なヘッダーファイルOpenCVで線を描画するには、<imgproc.hpp>ヘッダーをインクルードします。これは、line()関数がこのヘッダー内で定義され
-
C++とOpenCVで画像を読み込んで表示する方法を徹底解説
この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name