C++
 Computer >> コンピューター >  >> プログラミング >> C++

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() の活用も検討してみてください。

  1. C++とOpenCVを使って線を描画する方法

    OpenCVで線を描画するには、始点と終点の2つの座標が必要です。さらに、線を描くためのキャンバス(描画領域)も用意しなければなりません。線を描画するために必要な要素OpenCVでは、キャンバスとして機能するのが行列(Mat)です。この行列に対して、線の始点と終点を定義し、加えて以下の情報も指定します。線の色線の太さつまり、OpenCVで線を描くには、行列・2つの点・色・線の太さという4つの要素を宣言しておく必要があります。必要なヘッダーファイルOpenCVで線を描画するには、<imgproc.hpp>ヘッダーをインクルードします。これは、line()関数がこのヘッダー内で定義され

  2. C++とOpenCVで画像を読み込んで表示する方法を徹底解説

    この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name