gpt4 book ai didi

c++ - 将 FILE * stdout 重定向到 C++ 中的字符串

转载 作者:行者123 更新时间:2023-11-30 03:59:24 30 4
gpt4 key购买 nike

我想在 C++ 中执行 C 的一些功能。该函数将 FILE * 作为参数:

void getInfo(FILE* buff, int secondArgument);

你可以让它打印到标准输出:

getInfo(stdout, 1);
// the function prints results into stdout, results for each value secondArgument

但是在c++中如何让这个函数打印到stream或者stringstream,处理结果呢?我想将函数打印的内容捕获到一个字符串中,并对生成的字符串进行一些处理。

我尝试这样的事情:

for (i=0; i<1000; i++) {
getInfo(stdout, i);
// but dont want print to stdout. I want capture for each i, the ouput to some string
// or array of strings for each i.
}

最佳答案

在 Linux 中,最好的选择是匿名管道。

首先,创建一个管道:

int redirectPipe[2];
pipe(redirectPipe)

然后,使用 fdopen 打开通过 pipe(2) 返回给我们的文件描述符:

FILE* inHandle = fdopen(redirectPipe[0], "w");
FILE* outHandle = fdopen(redirectPipe[1], "r");

调用函数:

getInfo(inHandle, someValue);

然后,像读取普通文件一样使用 outHandle 进行读取。

有一点要注意:管道有固定的缓冲区大小,如果 getInfo 函数有可能填满缓冲区,就会出现死锁。

要防止死锁,您可以从另一个线程调用 getInfo,或者使用 fcntlF_SETPIPE_SZ 增加管道缓冲区大小。或者更好,正如 Ben Voigt 在评论中提到的那样,创建一个临时文件。

注意:我特定于 *nix,因为 OP 提到他/她想要“linux 中最好的”

关于c++ - 将 FILE * stdout 重定向到 C++ 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26941682/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com