文件*和istream:连接两个?

假设我“popen”一个可执行文件,我得到一个FILE*作为回报。 此外,假设我想“连接”这个文件到一个istream对象,以便于处理,有没有办法做到这一点?

Solutions Collecting From Web of "文件*和istream:连接两个?"

没有标准的方法,但是如果你想要一个快速的解决方案,你可以用fileno()获取文件描述符,然后使用Josuttis的fdstream 。 可能会有类似的努力,但我在遥远的过去使用它,它工作得很好。 如果没有别的,它应该是一个非常好的地图实施自己的。

你可以通过派生std :: basic_streambuf或std :: streambuf类来逃脱。
沿着这些线路的东西:

 #include <stdio.h> #include <iostream> #define BUFFER_SIZE 1024 class popen_streambuf : public std::streambuf { public: popen_streambuf() : fp(NULL) { } ~popen_streambuf() { close(); } popen_streambuf *open(const char *command, const char *mode) { fp = popen(command, mode); if (fp == NULL) return NULL; buffer = new char_type[BUFFER_SIZE]; // It's good to check because exceptions can be disabled if (buffer == NULL) { close(); return NULL; } setg(buffer, buffer, buffer); return this; } void close() { if (fp != NULL) { pclose(fp); fp = NULL; } } std::streamsize xsgetn(char_type *ptr, std::streamsize n) { std::streamsize got = showmanyc(); if (n <= got) { memcpy(ptr, gptr(), n * sizeof(char_type)); gbump(n); return n; } memcpy(ptr, gptr(), got * sizeof(char_type)); gbump(got); if (traits_type::eof() == underflow()) { return got; } return (got + xsgetn(ptr + got, n - got)); } int_type underflow() { if (gptr() == 0) { return traits_type::eof(); } if (gptr() < egptr()) { return traits_type::to_int_type(*gptr()); } size_t len = fread(eback(), sizeof(char_type), BUFFER_SIZE, fp); setg(eback(), eback(), eback() + (sizeof(char_type) * len)); if (0 == len) { return traits_type::eof(); } return traits_type::to_int_type(*gptr()); } std::streamsize showmanyc() { if (gptr() == 0) { return 0; } if (gptr() < egptr()) { return egptr() - gptr(); } return 0; } private: FILE *fp; char_type *buffer; }; int main(int argc, char *argv) { char c; popen_streambuf sb; std::istream is(&sb); if (NULL == sb.open("ls -la", "r")) { return 1; } while (is.read(&c, 1)) { std::cout << c; } return 0; } 

当然有一个办法,实现你自己的istream ,可以从FILE*构建。

如果你问是否有一个标准的方式来做到这一点,那么不。