個人的なまとめ。

何かてきとーに書きます。

C++で外部コマンド実行結果をストリームとして使う方法

学生さんの指導中,外部コマンドを実行してその結果をプログラムで受け取りたいという場面で,popenを思い出せなかった自分に憤慨したのでその史実を記録しておく.


参考URL
d.hatena.ne.jp

まずはソースコード

#include <iostream>
#include <ext/stdio_filebuf.h>
#include <cstdlib>

int main()
{
	// なにか実行したいコマンド
	std::string cmd = "ls -l";

	// popenでコマンド実行後の出力をファイルポインタで受け取る
	FILE *fp = popen(cmd.c_str(), "r");

	// streambufを作成し,istreamのコンストラクタに渡す
	__gnu_cxx::stdio_filebuf<char> *p_fb = new __gnu_cxx::stdio_filebuf<char>(fp, std::ios_base::in);
	std::istream input(static_cast<std::streambuf *>(p_fb));

	// getlineでストリームからコマンド出力を受け取る
	std::string buffer;
	while(getline(input, buffer)){
		std::cout << "out > " << buffer << std::endl;
	}

	// 最後に解放
	delete p_fb;
	pclose(fp);

	return 0;
}

コメントの通りである.おわり.