在 c++ 中将 FILE * stdout 重定向到字符串

Redirect FILE * stdout to string in c++

本文关键字:重定向 字符串 stdout c++ 中将 FILE      更新时间:2023-10-16

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

void getInfo(FILE* buff, int secondArgument);

您可以将其打印到标准输出:

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

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

我尝试这样的事情:

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 中最好的一个"