文档指出FILE
是标识流的对象类型。那么,是否可以获得与FILE
相关联的流对象?
例如,我想从std::cout
stdout
指针获取FILE
对象,或者从std::cerr
获取stderr
等。更一般地,我想编写一个重定向给定流并将自定义streambuf
设置为它的函数,如下所示:
void redirect(FILE* file, std::ios stream) {
freopen_s((FILE**)file, "CONOUT$", "w", file);
stream.rdbuf(customBuffer);
}
用于重定向流
redirect(stdout, std::cout);
redirect(stderr, std::cerr);
有两个参数似乎是多余的,因为两个参数总是相互关联。
答案 0 :(得分:5)
C ++标准库包含C标准库。 FILE
是C流,与C ++ iostream完全不同。 std::stream
实现可能依赖于基础FILE
,但标准不要求这样做,即使在这种情况下也无法检索它。
可以构建一个明确使用基础std::streambuf
的自定义FILE *
,并在std::stream
中使用它。 std::basic_streambuf
是C ++标准库中为数不多的几个类之一,它被明确地设计为自定义派生的基类。不幸的是我找不到它的教程,但是这个类包含了一些你必须覆盖的虚拟方法。这不是一条简单的道路,但可以通过一些工作,繁重的测试,并最终得到一些帮助,如果你被困在某个地方。但完全实施远远超出了答案。
TL / DR:没有与std::stream
关联的基础FILE
,但通过一些工作,您可以构建一个将使用基础stream_buffer
的自定义FILE *
。虽然那些是相当先进的操作......
答案 1 :(得分:0)
虽然不可能在C ++中干净地执行此操作,但您可以执行此类操作。
FILE * file = popen("someFile")
const unsigned BUFF = 2048;
string total;
bool done = false;
while (!done) {
vector<char> cBuf[BUFF];
size_t read = fread((void *)&cBuf[0], 1, BUFF, f);
if (read)
{
total.append(cBuf.begin(), cBuf.end());
}
if (read < BUFF)
{
done = true;
}
}
pclose(f);
istringstream filey(total);
希望这有帮助。