`

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;
	}
	
}

分享到:
评论

相关推荐

    MFC C++ 读取图片资源被占用无法显示替换

    这里需要注意的是,`CreateFile`函数的第一个参数为文件路径,第二个参数`GENERIC_READ`表示打开文件的目的是读取数据,第三个参数`FILE_SHARE_READ`表示允许其他进程同时读取该文件。 2. **获取文件大小**:通过`...

    C++输入输出流详解

    本篇文章将详细介绍 C++ 中的输入输出流,包括常用的输出流和输入流类,以及如何使用这些类进行文件的读写操作。 #### 二、输出流 在 C++ 中,最重要的三个输出流类分别是 `ostream`、`ofstream` 和 `...

    C++ 文件和流.pdf

    - **ifstream**: 表示输入文件流,用于从文件读取数据。 - **fstream**: 具有 `ofstream` 和 `ifstream` 的功能,可用于同时读写文件。 #### 三、文件操作流程 1. **打开文件** - 使用 `open()` 方法来打开文件...

    C++标准库中文件流读取操作小结

    2. **`basic_istream& get(char_type& _Ch)`**:该函数从文件流中读取一个字符并将其存储在由`_Ch`引用的变量中。 3. **`basic_istream& get(char_type* _Str, streamsize _Count)`**:该函数从文件流中读取最多`_...

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

    2. **`ifstream`**:用于文件读取(输入),该类由 `istream` 类派生而来。 3. **`fstream`**:同时支持文件的读取和写入,该类由 `iostream` 类派生而来。 #### 二、打开文件(Open a file) 对这些类的一个对象...

    C++读取CSV文件

    在上面的代码中,我们使用ifstream类打开了一个名为test.csv的文件,然后使用std::getline函数读取文件中的每一行,并将其存储在value字符串中。最后,我们使用std::cout对象输出value字符串。 二、使用getline函数...

    C++语言的流类体系与文件操作

    - **`ifstream`**:从`istream`派生而来,专门用于文件读取。 - **`ofstream`**:从`ostream`派生而来,专门用于文件写入。 这些类使得开发人员能够轻松地处理文件的读写操作。 ##### 2.3 文件的使用方法 使用文件...

    c++ 文件操作小结

    - **`istream`**:输入流,负责从文件读取数据。 - **`ostream`**:输出流,负责向文件写入数据。 - **`cin`**:标准输入流,通常与键盘关联。 - **`cout`**:标准输出流,通常与显示器关联。 - **`cerr`**:标准...

    C++ 输入输出精讲

    ` 创建了一个 `ofstream` 对象 `SaveFile`,并尝试打开名为 `cpp-home.txt` 的文件。如果文件不存在,将会创建新文件;如果文件已存在,则会覆盖原有内容。 3. **写入数据**:`SaveFile , from ...

    谭浩强C++课件第13章输入输出流.ppt

    - **istream**:继承自ios,用于处理输入操作,例如从键盘或文件读取数据。 - **ostream**:同样继承自ios,但用于处理输出操作,如输出到屏幕或文件。 - **iostream**:继承自istream和ostream,提供同时处理...

    C++程序设计与数据结构基础:第8章 C++ IO流标准库.ppt

    本章内容为读者提供了C++程序设计中IO流标准库的基础知识,涵盖了C++ I/O流概述、控制台与文件的输入与输出、外部存储介质、内存变量写文件(输出)读文件(输入)等方面的知识点,从而帮助读者更好地理解和应用C++...

    用IStream读取保存图像

    在读取`IStream`时,你需要创建一个解码器,将流中的数据转换为图像对象;在保存时,你需要创建一个编码器,将图像对象的数据写入`IStream`。 总的来说,`IStream`和`IStorage`是Windows编程中处理数据流和存储的...

    C++文件处理

    - 这里 `reinterpret_cast` 用于转换类型,将整数指针转换为字符指针。 #### 8. 总结 - C++ 文件处理主要涉及文件的创建、打开、读写操作及文件定位控制等功能。 - 文件结构的设计对于提高文件处理效率至关重要。...

    C++流类体系与文件操作

    在C++编程中,流(Stream)是一种抽象概念,它代表了数据的流动,使得数据可以从一种媒介(如键盘)流向另一种媒介(如磁盘文件或显示器)。C++的流类体系是为简化输入/输出操作而设计的一系列类的集合,其中包含了...

    C++ 打开文件

    8. **文件指针**:虽然C++标准库提供了面向对象的文件操作方法,但C风格的文件指针(`FILE*`)在某些情况下也适用,例如通过`fopen()`, `fclose()`, `fread()`, `fwrite()`, `fprintf()`等函数进行操作。 9. **二...

    便携式媒体数据库MTP读写实例(C++版)

    例如,可以使用`IStream::Read`和`IStream::Write`读取和写入文件内容。 5. **元数据操作**:MTP支持获取和设置文件的元数据,如作者、专辑名等。开发者可以通过`IWPDProperties`接口来操作元数据。 6. **事务处理...

    C++_fstream的使用方法

    在C++的文件输入输出中,文件指针的概念非常重要。每个文件都有两个指针:读指针和写指针,分别用于指示文件中读取和写入的位置。 - **读指针和写指针**: - 读指针:指示下一次读取操作的位置。 - 写指针:指示...

    C++文件操作.ppt

    C++文件操作是计算机编程语言C++中的一个重要组成部分,涉及到文件的读取、写入、处理等操作。以下是C++文件操作的相关知识点: 一、数据层次 * 位(Bit):计算机的基本存储单元,表示0或1 * 字节(Byte):8位,...

Global site tag (gtag.js) - Google Analytics