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; }
コメントの通りである.おわり.