C++ 如何在C+中打开一个进程并将结果读入ifstream+;节目?

C++ 如何在C+中打开一个进程并将结果读入ifstream+;节目?,c++,c++11,process,fstream,ifstream,C++,C++11,Process,Fstream,Ifstream,我正在编写一个将在Unix环境中运行的C++11程序(可移植性不是一个问题)。目前,我有一个Makefile,它调用两个进程,一个进程写入一个文件,另一个进程读取该文件 目标: mkfifomyfile 其他程序>我的文件& 我的程序我的文件 出于各种原因,我希望在我的_程序中调用所有这些。它看起来很有希望,因为它调用了一个外部进程并提供了一个我可以读取的文件。但是,我已经编写的现有文件处理代码使用ifstream: std::ifstreamstream1(argv[1]) 有没有合适的方法

我正在编写一个将在Unix环境中运行的C++11程序(可移植性不是一个问题)。目前,我有一个Makefile,它调用两个进程,一个进程写入一个文件,另一个进程读取该文件

目标:
mkfifomyfile
其他程序>我的文件&
我的程序我的文件

出于各种原因,我希望在我的_程序中调用所有这些。它看起来很有希望,因为它调用了一个外部进程并提供了一个我可以读取的文件。但是,我已经编写的现有文件处理代码使用ifstream:

std::ifstreamstream1(argv[1])


有没有合适的方法将popen的文件*连接到ifstream?我是否应该用别的东西来代替popen

您可以创建一个从
文件*
读取的流缓冲区。显然,如果在创建流以外的其他地方使用
std::ifstream
,您可能需要更改代码以使用
std::istream
,但这应该是一个直接的更改。下面是一个简单的演示,演示如何创建相应的流缓冲区以及如何使用它:

#include <cstdio>
#include <iostream>

struct FILEbuf
    : std::streambuf {
    FILEbuf(FILE* fp): fp_(fp) {}
    int underflow() {
        if (this->gptr() == this->egptr()) {
            int size = fread(this->buffer_, 1, int(s_size), this->fp_);
            if (0 < size) {
                this->setg(this->buffer_, this->buffer_, this->buffer_ + size);
            }
        }
        return this->gptr() == this->egptr()
            ? traits_type::eof()
            : traits_type::to_int_type(*gptr());
     }
     FILE* fp_;
     enum { s_size = 1024 };
     char  buffer_[s_size];
};

int main()
{
    FILEbuf      sbuf(popen("ls -l", "r"));
    std::istream in(&sbuf);
    for (std::string line; std::getline(in, line); ) {
        std::cout << line << '\n';
    }
}
#包括
#包括
结构文件buf
:std::streambuf{
FILEbuf(FILE*fp):fp_2;(fp){}
int下溢(){
如果(this->gptr()==this->egptr()){
int size=fread(这个->缓冲区大小,1,int(s\u大小),这个->缓冲区大小);
如果(0<大小){
此->设置(此->缓冲区,此->缓冲区,此->缓冲区+大小);
}
}
返回this->gptr()==this->egptr()
?特征类型::eof()
:traits_type::to_int_type(*gptr());
}
文件*fp_3;;
枚举{s_size=1024};
字符缓冲区[s_大小];
};
int main()
{
文件buf sbuf(popen(“ls-l”、“r”));
std::istream in(&sbuf);
for(std::string line;std::getline(in,line);){

std::cout Thank,这很有效!虽然我不想假装理解您作为FILEbuf结构的一部分实现的一些函数/成员。s_大小为1024有什么原因吗?@Chris:1024是内部缓冲区的大小。如果您希望获得很少的数据,可以将其缩小;如果您希望获得大量数据,可以将其缩小我想这不会有多大区别。