`

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

    博客分类:
  • 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


示例代码(完整程序见附件):
#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;
	}
	
}

分享到:
评论

相关推荐

    C++文件操作 C++ 文件操作

    被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。 要通过一个流对象打开一个文件,我们使用它的成员函数open(): ...

    istream_iterator 读取输入文件

    C++ primer 第五版 中文版 练习 10.33 ...使用istream_iterator 读取输入文件。使用ostream_iterator将奇数写入第一个输出文件,每个值后都跟一个空格。将偶数写入第二个输出文件,每个值都独占一行。

    用IStream读取保存图像

    用IStream读取图像,用Istorge保存

    C++流操作之fstream用法介绍

    在Windows平台对文件进行存取操作可选的方案有很多,如果采用纯C,则需要用到File*等,当然也可以直接调用Windows API来做;如果采用C++,首先想到的就是文件流fstream。虽然在COM层面上,我们还可以使用IStream来...

    C++ 输入输出流重定向到外设

    C++ 标准输入输出模块,为字符流操作提供了便捷的途径,软件开发当中,尤其是嵌入式系统开发当中,有时候需要把流信息重新定向到特定的端口,如串口,以太网,USB等。如标准输入输出cout, cin默认将字符流定向到...

    C++中输入输出流及文件流操作总结

    本文实例为大家分享了C++中输入输出流及文件流操作笔记,供大家参考,具体内容如下 1、流的控制  iomanip 在使用格式化I/O时应包含此头文件。  stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数...

    IStream.zip IStream.tlb

    [VB]GDI+ IStream StdPicture Byte 互转 原网页已经删除了 所以在这里提供了

    C++矩阵运算的实现

    C++控制台程序,利用指针进行矩阵的加、减、乘运算 头文件代码如下: #ifndef MATRIX_H #define MATRIX_H #include using namespace std; class Matrix { public: Matrix(int zRow = 0, int zLine = 0, double *...

    深入理解C++中的文件操作

    我们在编写程序的时候,最密不可分的就是对文件进行相应的操作,我们可以从文件中读取数据,可以将数据保存到文件,可以…… 总而言之,言而总之,一言以蔽之,对文件的操作是非常重要的,下面我们就来介绍一下C++中...

    IStream的软件源码

    IStreamVB经典源码,别的地方都找不到,本站长期提供原创源码

    VC GDI+ 窗口截图内存BMP转JPG,压缩、JPG再转IStream流,IStream流再转 BYTE

    VC GDI+ 窗口截图内存BMP转JPG,压缩、JPG再转IStream流,IStream流再转 BYTE 上体见 http://blog.csdn.net/q610098308/article/details/78181933

    C++标准库stl

    &lt;istream&gt; 为管理输出流缓存区的输入定义模板类 &lt;ostream&gt; 为管理输出流缓存区的输出定义模板类 &lt;sstream&gt; 支持字符串的流输入输出 &lt;fstream&gt; 支持文件的流输入输出 &lt;iosfwd&gt; 为输入输出对象提供向前的声明 ...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    4.3 数据输入输出的概念及在 C 语言中的实现 54 4.4 字符数据的输入输出 54 4.4.1 putchar 函数(字符输出函数) 54 4.4.2 getchar函数(键盘输入函数) 55 4.5 格式输入与输出 55 4.5.1 printf 函数(格式输出函数...

    基于C++开发的宠物小屋源码+项目说明+sln解决方案(课程设计).zip

    _Str :将输入流读取的字符串放到_Str 中。 _Delim:遇到这个字符就停止读取,不设置默认为'\n' 本项目是作者初学C++中类相关知识的时候写的一个练习使用类的小项目。 &gt; - 类之间的横向关系和纵向关系是C++中很重要...

    详解C++编程中对二进制文件的读写操作

    二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...

    在C++语言中,数据的输入和输出

    C++语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream等,其中ios为根基类,其余都是它的直接或间接...

    iStream DDS产品简要介绍

    数据库复制软件iStream DDS产品简要介绍

Global site tag (gtag.js) - Google Analytics