它是直線前進使用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";
}
基本思想是你可以通過實現一個流緩衝區來創建一個新的流。上面的實現應該相當完整。儘管最可能發生錯誤的情況是管道被關閉,並且沒有什麼可以做的事情,但是可以改進不完整緩衝區的錯誤處理。
試着看'boost :: iostreams :: file_descriptor'。它有非常糟糕的文檔,但它可以幫助你,它是跨平臺的。 – vladon
是否有任何特定原因需要*使用'ostream' –
您可以在創建過程之前將所有輸入放入'fileStream'中,然後將其作爲輸入反饋給'my_prog',或者直接輸入一些未知的輸入過程創建後? – 1201ProgramAlarm