无法从'g ++'调用获得输出结果

时间:2013-11-06 18:34:08

标签: c++ command-line

我正在用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" )命令,但它确实有效,但它不起作用。 它可能与g ++调用失败的事实有关,因为我的cpp文件存在缺陷吗?

由于

1 个答案:

答案 0 :(得分:2)

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

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

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