0

我正在用 C++ 进行系统调用:

system( "g++ file1.cpp -o test" );

我正在尝试将命令行中的结果放入一个std::string对象中。我这样做的原因是在 g++ 失败的情况下分析 g++ 的输出,因为 cpp 中有错误。这是我为此构建的方法:

std::string CmdLineCall( std::string cmd )
{
    FILE* pipe = _popen( cmd.c_str(), "r");
    if( pipe == NULL )
    {
        return "error";
    }

    char* buffer;
    long bufferSize = cmd.size();
    size_t code;
    std::string result;

    buffer = ( char* )malloc( sizeof( char ) * bufferSize );
    if( buffer == NULL )
    {
        return "error";
    }

    code = fread( buffer, 1, sizeof( buffer ), pipe );
    if( code != bufferSize )
    {
        return "error";
    }

    result = buffer;
    return result;
}

我已经对其进行了调试,它一直运行到最后,但结果 =“”。

我试过一个简单的system( "pause" )命令,它可以工作,但它不起作用。由于我的 cpp 文件有缺陷,g++ 调用失败是否与此有关?

谢谢

4

1 回答 1

2

使用system()可能不是最好的选择。你可能会得到更好的结果popen(),因为它可以让你读取命令的标准输出——但我怀疑这也不够(因为我假设编译器也可能打印到 stderr 并且 popen() 没有给出你那个)。

你最好的选择是提供你自己的 popen 变体,包括对 stdout 和 stderr 的支持(如果你搜索“popen source”,我相信你会有一个很好的起点)。

编辑:在重新阅读您的帖子时,我看到您正在使用 popen() ......所以我对 system() 的作用有点困惑,因为您不会同时使用它们。无论如何,我仍然觉得问题在于 stderr 很重要,而 popen() 并没有给你,所以你需要自己去获取它;您可以通过重写popen() 来做到这一点,或者您可以在调用popen() 之前将自己的stderr 重定向到管道的输入通道。

于 2013-11-06T18:39:18.863 回答