如何获取FILE标识的流对象?

问题描述 投票:-1回答:2

文档指出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);

有两个参数似乎是多余的,因为两个参数总是相互关联。

c++ iostream
2个回答
5
投票

C ++标准库包括C标准库。 FILE是一个C流,它是一个与C ++ iostream完全不同的动物。 std::stream实现可能依赖于底层的FILE,但标准并不要求这样做,即使在这种情况下也无法检索它。

可能的是建立一个明确使用底层std::streambuf的自定义FILE *,并在std::stream中使用它。 std::basic_streambuf是C ++标准库中为数不多的几个类之一,它被明确地设计为自定义派生的基类。不幸的是我找不到它的教程,但是这个类包含了一些你必须覆盖的虚拟方法。这不是一条简单的道路,但可以通过一些工作,繁重的测试,并最终得到一些帮助,如果你被困在某个地方。但完全实施远远超出了答案。

TL / DR:没有潜在的std::streamFILE相关联,但有一些工作,你可以建立一个定制的stream_buffer,将使用底层的FILE *。虽然那些是相当先进的操作......


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);

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.