通过stdin和ostream向程序发送数据. (C )

我想将数据从我的C程序发送到外部管道,如下所示:
FILE* file = popen("my_prog -opt | other_prog","w");
std::ostream fileStream = some_function(file);
fileStream << "some data";

我明白没有简单的,跨平台的方式来做第二行,但是有什么办法可以使用别的东西来完成同样的事情吗?我不需要使用popen,但我确实需要使用ostream.它需要使用clang和gcc进行编译,但最好是与任何编译器配合使用.我也可以改变我如何处理管道,但是我没有my_prog或other_prog的源代码.

解决方法

直接使用FILE *创建流缓冲区作为底层目标,并使用这样的流缓冲区创建相应的std :: ostream.它会大致看起来像这样:
#include <stdio.h>
#include <streambuf>
#include <ostream>

class stdiobuf
    : public std::streambuf {
    enum { bufsize = 2048 };
    char buffer[bufsize];
    FILE* fp;
    int   (*close)(FILE*);
    int overflow(int c) {
        if (c != std::char_traits<char>::eof()) {
            *this->pptr() = std::char_traits<char>::to_char_type(c);
            this->pbump(1);
        }
        return this->sync()
            ? std::char_traits<char>::eof()
            : std::char_traits<char>::not_eof(c);
    }
    int sync() {
        std::streamsize size(this->pptr() - this->pbase());
        std::streamsize done(this->fp? fwrite(this->pbase(),1,size,this->fp): 0);
        this->setp(this->pbase(),this->epptr());
        return size == done? 0: -1;
    }
public:
    stdiobuf(FILE* fp,int(*close)(FILE*) = fclose)
        : fp(fp),close(close) {
        this->setp(this->buffer,this->buffer + (this->fp? bufsize - 1: 0));
    }
    ~stdiobuf() {
        this->sync();
        this->fp && this->close(this->fp);
    }
};
class opipestream
    : private virtual stdiobuf,public std::ostream {
public:
    opipestream(std::string const& pipe)
        : stdiobuf(popen(pipe.c_str(),"w"),pclose),std::ios(static_cast<std::streambuf*>(this)),std::ostream(static_cast<std::streambuf*>(this)) {
    }
};

int main()
{
    opipestream out("/usr/bin/sed -e 's/^/xxxx /'");
    out << "Hello\n";
    out << "world\n";
}

基本思想是您可以通过实现流缓冲区来创建新流.上述实施应当相当完整.当不完整的缓冲区可以改进时的错误处理,尽管最可能的错误是管道关闭,并且没有太多的可以做的事情.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...