Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将printf输出重定向回代码? 我写了一个小的C++应用程序来围绕OpenCV Haar函数(即CVCeReTeTeCaseCCADECL)。该函数向控制台抛出整个输出负载,我希望解析该输出,以便在代码中填充各种变量_C++_Redirect_Console_Opencv_Printf - Fatal编程技术网

如何将printf输出重定向回代码? 我写了一个小的C++应用程序来围绕OpenCV Haar函数(即CVCeReTeTeCaseCCADECL)。该函数向控制台抛出整个输出负载,我希望解析该输出,以便在代码中填充各种变量

如何将printf输出重定向回代码? 我写了一个小的C++应用程序来围绕OpenCV Haar函数(即CVCeReTeTeCaseCCADECL)。该函数向控制台抛出整个输出负载,我希望解析该输出,以便在代码中填充各种变量,c++,redirect,console,opencv,printf,C++,Redirect,Console,Opencv,Printf,我希望使用的函数不是实际openCV库的一部分;相反,它必须用我的代码作为项目的一部分来构建。函数的所有输出都通过printf 问题:是否可以在printf语句在控制台上结束之前拦截它们?我已经设法使用freopen重定向了它们,但这似乎有点笨拙,因为我需要解析文件,然后在函数调用完成后将其删除。此外,该函数可能会运行几个小时(甚至可能几周!),因此如果文件也经常被追加,那么文件的大小可能会成为一个问题 要求:我需要这个应用程序是C++,并在Windows和Linux上运行(但是如果需要的话,条

我希望使用的函数不是实际openCV库的一部分;相反,它必须用我的代码作为项目的一部分来构建。函数的所有输出都通过printf

问题:是否可以在printf语句在控制台上结束之前拦截它们?我已经设法使用freopen重定向了它们,但这似乎有点笨拙,因为我需要解析文件,然后在函数调用完成后将其删除。此外,该函数可能会运行几个小时(甚至可能几周!),因此如果文件也经常被追加,那么文件的大小可能会成为一个问题

要求:我需要这个应用程序是C++,并在Windows和Linux上运行(但是如果需要的话,条件编译语句没有问题)。我还希望能够在控制台上看到我的cout和cerr消息(而不是printf)

我的谷歌搜索删除了我的生存意志!有人能通过代码示例或指向我应该寻找答案的地方的指针来帮助解决问题吗


谢谢

将库封装到应用程序中,并将应用程序的输出通过管道传输到应用程序。现在编写一个脚本,这样你就不必每次都用管道一起运行应用程序了。

看看:这似乎很有希望,但我从未尝试过。

你可以做的是:

  • 创建一个管道
  • 使管道的可写端成为新标准输出
  • 从管道的可读部分读取
读写应该在不同的线程中进行,否则您的程序可能会在管道的一端耗尽

以下是如何在unix和windows中执行重定向的示例:



(我在这里使用assert,因为我太懒了,无法对这个例子进行真正的错误检查)

非常好-这正是我所需要的。我读了很多关于所有这些函数等的书,但是大多数例子都是以一种过于复杂的方式呈现的,这使得理解它们有点困难。你的例子很完美,很简短,也很中肯。谢谢!
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
/* gcc defined unix */
#ifdef unix
#include <unistd.h>
#endif
#ifdef WIN32
#include <io.h>
#define pipe(X) _pipe(X,4096,O_BINARY)     
#define fileno _fileno
#define dup2 _dup2
#define read _read

#endif
#include <assert.h>

int main()
{
    int fds[2]; 
    int res; 
    char buf[256];
    int so; 

    res=pipe(fds);
    assert(res==0); 

    so=fileno(stdout);
    // close stdout handle and make the writable part of fds the new stdout.
    res=dup2(fds[1],so);
    assert(res!=-1); 

    printf("Hi there\n");
    fflush(stdout);
    // reading should happen in a different thread

    res=read(fds[0],buf,sizeof(buf)-1);
    assert(res>=0 && res<sizeof(buf));
    buf[res]=0;
    fprintf(stderr,"buf=>%s\n",buf);
    return 0;
}
buf=>Hi there