C++中读取控制台输出,并将文件指针FILE*转换为istream
程序员文章站
2022-07-04 12:10:57
...
解决的问题:
获取bash命令的输出:http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html
将文件指针FILE*转换为istream:https://*.com/questions/2746168/how-to-construct-a-c-fstream-from-a-posix-file-descriptor
本文采用以上问题中Mark给的方案(貌似boost库中用的也是该方案),即重新定义了一个buffer类,参见以下链接中的fdinbuf类及其在fdistream中的使用方式:http://www.josuttis.com/cppcode/fdstream.html
示例代码(完整程序见附件):
- 1、通过执行系统的bash命令后,获取其输出(类似python的subprocess模块)
- 2、将输出从FILE*转换为std::istream,方便按照C++的方式进行处理
获取bash命令的输出:http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html
将文件指针FILE*转换为istream:https://*.com/questions/2746168/how-to-construct-a-c-fstream-from-a-posix-file-descriptor
本文采用以上问题中Mark给的方案(貌似boost库中用的也是该方案),即重新定义了一个buffer类,参见以下链接中的fdinbuf类及其在fdistream中的使用方式:http://www.josuttis.com/cppcode/fdstream.html
示例代码(完整程序见附件):
#include <iostream> #include <fstream> #include <cstdlib> #include <stdio.h> #include <string> #include <memory> #include "fdstream.hpp" //using namespace std; using std::string; std::shared_ptr<boost::fdistream> eg_read_from_bash_output(const char *cmd) { ::FILE *fp = ::popen(cmd, "r"); if (!fp) { throw string("count not open PIPE"); } //boost::fdistream fs(fileno(fp)); //注意因为父类istream没有 operator =, 不能够将改类作为返回值。 //如需将fs作为返回值,需使用std::shared_ptr进行封装: http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr std::shared_ptr<boost::fdistream> pfi(new boost::fdistream(fileno(fp))); return pfi; } int main(){ auto pfi = eg_read_from_bash_output("cat hello.txt"); boost::fdistream& fs = *pfi; string line; while (std::getline(fs, line)) { std::cout << line << std::endl; } }