C++でコマンドを実行し、POSIXを使ってコマンドの出力を取得する方法
C++のプログラムから外部コマンドを実行し、その標準出力(stdout)を取得したい場合、POSIXで提供されている popen と pclose 関数を利用すると便利です。popen() 関数は、パイプを生成し、プロセスをフォークした上でシェルを呼び出すことで、指定したコマンドの実行プロセスを開きます。
この仕組みを利用すれば、バッファを使って標準出力の内容を順番に読み込み、結果用の文字列に追記していき、プロセスが終了した時点でその文字列を返すという処理が実現できます。
サンプルコード
#include <iostream>
#include <stdexcept>
#include <stdio.h>
#include <string>
using namespace std;
string exec(string command) {
char buffer[128];
string result = "";
// コマンドへのパイプを開く
FILE* pipe = popen(command.c_str(), "r");
if (!pipe) {
return "popen failed!";
}
// プロセスが終了するまで読み続ける
while (!feof(pipe)) {
// バッファを使って読み込み、結果に追加する
if (fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
int main() {
string ls = exec("ls");
cout << ls;
}実行結果
このプログラムを実行すると、次のような出力が得られます(ls コマンドの結果として、カレントディレクトリ内のファイル一覧が表示されます)。
a.out hello.cpp hello.py hello.o hydeout my_file.txt watch.py
補足:注意点
popen() の第2引数には、読み取り専用の場合は "r" を指定します。書き込みが必要な場合は "w" を使います。また、pclose() はプロセスの終了を待機するため、確実にリソースを解放するためにも必ず呼び出すようにしましょう。エラー出力(stderr)はパイプを通らないため、必要であればシェル側で 2>&1 などによるリダイレクトを検討してください。
-
C++とOpenCVで動画の現在のフレーム位置を取得する方法
「現在のフレーム」とは、動画を再生している際に画面に表示されているフレームのことを指します。これは「アクティブフレーム」とも呼ばれます。多くのアプリケーション開発では、現在表示中のフレーム番号を取得する必要が生じることがあります。OpenCVのVideoCaptureクラスには、CAP_PROP_POS_FRAMESプロパティを指定してget()メソッドを呼び出すことで、現在のフレーム位置(0から始まるインデックス)を取得する機能が用意されています。以下のプログラムは、動画の現在のフレーム位置を読み取り、コンソールウィンドウに表示します。サンプルコード#include<opencv2/o
-
C++とOpenCVで特定のピクセルの値を取得する2つの方法を解説
OpenCVで画像内の特定のピクセルの値を読み取るには、「at」メソッドを使う方法と、Mat_クラスによる「直接アクセス」を使う方法の2通りがあります。本記事では、両方のアプローチをサンプルコードとともにわかりやすく解説します。 「at」メソッドでピクセル値を取得する まずは「at」メソッドから見ていきましょう。次のプログラムは、カラー画像の座標 (10, 29) にあるピクセルの値を読み出す例です。 サンプルコード #include<iostream> #include<opencv2/highgui/highgui.hpp> using namespace std;