解决的问题:
- 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;
}
}
分享到:
相关推荐
这里需要注意的是,`CreateFile`函数的第一个参数为文件路径,第二个参数`GENERIC_READ`表示打开文件的目的是读取数据,第三个参数`FILE_SHARE_READ`表示允许其他进程同时读取该文件。 2. **获取文件大小**:通过`...
本篇文章将详细介绍 C++ 中的输入输出流,包括常用的输出流和输入流类,以及如何使用这些类进行文件的读写操作。 #### 二、输出流 在 C++ 中,最重要的三个输出流类分别是 `ostream`、`ofstream` 和 `...
- **ifstream**: 表示输入文件流,用于从文件读取数据。 - **fstream**: 具有 `ofstream` 和 `ifstream` 的功能,可用于同时读写文件。 #### 三、文件操作流程 1. **打开文件** - 使用 `open()` 方法来打开文件...
2. **`basic_istream& get(char_type& _Ch)`**:该函数从文件流中读取一个字符并将其存储在由`_Ch`引用的变量中。 3. **`basic_istream& get(char_type* _Str, streamsize _Count)`**:该函数从文件流中读取最多`_...
2. **`ifstream`**:用于文件读取(输入),该类由 `istream` 类派生而来。 3. **`fstream`**:同时支持文件的读取和写入,该类由 `iostream` 类派生而来。 #### 二、打开文件(Open a file) 对这些类的一个对象...
在上面的代码中,我们使用ifstream类打开了一个名为test.csv的文件,然后使用std::getline函数读取文件中的每一行,并将其存储在value字符串中。最后,我们使用std::cout对象输出value字符串。 二、使用getline函数...
- **`ifstream`**:从`istream`派生而来,专门用于文件读取。 - **`ofstream`**:从`ostream`派生而来,专门用于文件写入。 这些类使得开发人员能够轻松地处理文件的读写操作。 ##### 2.3 文件的使用方法 使用文件...
- **`istream`**:输入流,负责从文件读取数据。 - **`ostream`**:输出流,负责向文件写入数据。 - **`cin`**:标准输入流,通常与键盘关联。 - **`cout`**:标准输出流,通常与显示器关联。 - **`cerr`**:标准...
` 创建了一个 `ofstream` 对象 `SaveFile`,并尝试打开名为 `cpp-home.txt` 的文件。如果文件不存在,将会创建新文件;如果文件已存在,则会覆盖原有内容。 3. **写入数据**:`SaveFile , from ...
- **istream**:继承自ios,用于处理输入操作,例如从键盘或文件读取数据。 - **ostream**:同样继承自ios,但用于处理输出操作,如输出到屏幕或文件。 - **iostream**:继承自istream和ostream,提供同时处理...
在读取`IStream`时,你需要创建一个解码器,将流中的数据转换为图像对象;在保存时,你需要创建一个编码器,将图像对象的数据写入`IStream`。 总的来说,`IStream`和`IStorage`是Windows编程中处理数据流和存储的...
本章内容为读者提供了C++程序设计中IO流标准库的基础知识,涵盖了C++ I/O流概述、控制台与文件的输入与输出、外部存储介质、内存变量写文件(输出)读文件(输入)等方面的知识点,从而帮助读者更好地理解和应用C++...
- 这里 `reinterpret_cast` 用于转换类型,将整数指针转换为字符指针。 #### 8. 总结 - C++ 文件处理主要涉及文件的创建、打开、读写操作及文件定位控制等功能。 - 文件结构的设计对于提高文件处理效率至关重要。...
在C++编程中,流(Stream)是一种抽象概念,它代表了数据的流动,使得数据可以从一种媒介(如键盘)流向另一种媒介(如磁盘文件或显示器)。C++的流类体系是为简化输入/输出操作而设计的一系列类的集合,其中包含了...
8. **文件指针**:虽然C++标准库提供了面向对象的文件操作方法,但C风格的文件指针(`FILE*`)在某些情况下也适用,例如通过`fopen()`, `fclose()`, `fread()`, `fwrite()`, `fprintf()`等函数进行操作。 9. **二...
例如,可以使用`IStream::Read`和`IStream::Write`读取和写入文件内容。 5. **元数据操作**:MTP支持获取和设置文件的元数据,如作者、专辑名等。开发者可以通过`IWPDProperties`接口来操作元数据。 6. **事务处理...
在C++的文件输入输出中,文件指针的概念非常重要。每个文件都有两个指针:读指针和写指针,分别用于指示文件中读取和写入的位置。 - **读指针和写指针**: - 读指针:指示下一次读取操作的位置。 - 写指针:指示...
C++文件操作是计算机编程语言C++中的一个重要组成部分,涉及到文件的读取、写入、处理等操作。以下是C++文件操作的相关知识点: 一、数据层次 * 位(Bit):计算机的基本存储单元,表示0或1 * 字节(Byte):8位,...