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

时间:2014-11-15 01:57:34

标签: c++ c++11

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

void getInfo(FILE* buff, int secondArgument);

您可以将其打印到stdout:

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.
}

1 个答案:

答案 0 :(得分:2)

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