繁体   English   中英

在C ++应用程序中使用C库的标准输出

[英]Using standard output from C library in C++ application

我有用C编写的代码,我正在努力建立一个可以访问其他语言功能的库。

我目前正在为此代码编写C ++客户端,以弄清楚需要进行哪些更改才能提供支持,以将我的库包含到C ++应用程序中。

通常,基于C的二进制文件会分析一些输入,然后通过一系列fprintf语句将其数据输出到stdout

有没有一种方法可以重定向从相关C函数发送到stdout

我不是C ++专家,但是我想我想做的是提供C ++输出流缓冲区的子类( ostreamofstream ?),其中包含相同的输出,否则相关C函数会将这些输出发送到stdout

如果可能的话,我想选择将该数据重定向到文件流或C ++应用程序中的标准输出。

我该怎么办? 我可以按原样保留C代码并从C ++代码内重定向stdout吗?

编辑

我可以编辑有问题的C函数,以便文件指针或描述符是参数。 能够传递输出的位置对您有帮助吗? 我不清楚我将如何转换C ++ IO和C IO。 我无法将C ++ iostream传递给C函数,或者可以吗?

您需要设置管道 ,并以其标准输出连接到管道输入端的独立过程运行C程序。 然后,您的C ++程序需要从管道的输出端读取,然后它将从C进程获取所有输出。

更新:在投票和评论之后,我重新阅读了更多问题。 我(现在)意识到C代码正在作为库运行,即链接到与C ++代码相同的可执行文件中。

我认为您不能在不影响C ++程序输出流的情况下强行重定向C代码的stdout,这对于拥有一个库来说似乎要付出很高的代价。

我仍然认为解决方案是在自己的过程中“沙盒化” C代码,并带有重定向的输出,您可以根据需要读取该输出。 当然,最好重写C功能以return结果而不是打印结果,但是我认为这不是一种选择。

您说C代码使用fprintf() ,即具有显式文件句柄的变体,因此也许您可以使用它并使其从外部接受FILE * ,在这种情况下,您可以将其送入管道而不必进行子处理它。

对看到其他答案非常感兴趣,也许我缺少一种方法。

更新2 :如果您有机会控制将哪个FILE *传递给C库,那么很简单:

  • 要使输出与C ++程序的普通输出一起出现,只需传入stdout
  • 要将输出捕获到文件中,请fopen()该文件并传入结果FILE *

如果您想同时进行这两个操作,那又会麻烦一些。 在那种情况下,我会再次建议使用管道或套接字,以便C ++端负责读取C库生成的输出,并对其进行所需的处理。

在评论中,我提到C ++ std::cout和C stdout以一种棘手的方式关联,并且可以通过包含<cstdio>在C ++中使用stdout 我还提供了以下链接: http : //gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/manual/manual/io_and_c.html

但是,您可以考虑更改库的API,并提供写入用户提供的流和/或用户提供的文件路径的函数。

在Linux上,您也可以使用open_memstreamfopencookie

如果我正确理解了您的问题,则不会,至少是使用符合标准的代码。

可能相关的是std :: ios_base :: sync_with_stdio,它可以确保在某些C ++流上创建的IO与C流的IO版本正确同步。 因此,stdout与cout,stdin与cin和stderr width cerr同步。 但这并不是为了允许在cout中更改streambuf并将更改传播到stdout(这就是我理解您的请求的方式),并且如果您对stdout进行freopen的话,我对预期的效果还不确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM