C++中读取控制台输出,并将文件指针FILE*转换为istream_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > C++中读取控制台输出,并将文件指针FILE*转换为istream

C++中读取控制台输出,并将文件指针FILE*转换为istream

 2017/11/27 20:50:46  cherishLC  程序员俱乐部  我要评论(0)
  • 摘要:解决的问题:1、通过执行系统的bash命令后,获取其输出(类似python的subprocess模块)2、将输出从FILE*转换为std::istream,方便按照C++的方式进行处理获取bash命令的输出:http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html将文件指针FILE*转换为istream:https://stackoverflow.com/questions/2746168/how-to-construct
  • 标签:file 输出 文件 c++ 指针
解决的问题:
  • 1、通过执行系统的bash命令后,获取其输出(类似python的subprocess模块)
  • 2、将输出从FILE*转换为std::istream,方便按照C++的方式进行处理



获取bash命令的输出:http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html

将文件指针FILE*转换为istream:https://stackoverflow.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


示例代码(完整程序见附件):
class="c++" name="code">#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;
	}
	
}

  • read_from_bash_output.zip (3.1 KB)
  • 下载次数: 0
发表评论
用户名: 匿名