我想在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.
}
答案 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
,或使用fcntl
和F_SETPIPE_SZ
增加管道缓冲区大小。或者更好,正如Ben Voigt在评论中提到的那样,创建一个临时文件。
注意:我特定于* nix,因为OP提到他/她想要“linux中最好的一个”