我正在用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文件存在缺陷吗?
由于
答案 0 :(得分:2)
使用system()
可能不是最佳选择。使用popen()
可能会有更好的结果,因为这可以让你读取命令的标准输出 - 但我怀疑这里也不够(因为我认为编译器也可以打印到stderr和popen( )不会给你那个。)
你最好的选择是提供你自己的popen变体,包括对stdout和stderr的支持(如果你搜索“popen source”,我相信你会有一个很好的起点)。
编辑:在重新阅读你的帖子时,我发现你正在使用popen()......所以我对system()发挥作用有点困惑,因为你不会同时使用它们。无论如何,我仍然觉得问题是stderr很重要而且popen()没有给你,所以你需要自己去拿它;你可以通过重写popen()来做到这一点,或者你可以在调用popen()之前将自己的stderr重定向到管道的输入通道。