2017-04-19 139 views
-4

我正在尝试编写一个程序,帮助我编辑mp3文件的标签。我在python中创建了一个原型,但在C++中,我遇到了调用cli程序的麻烦。在C++中调用命令行程序

我所做的是将用户输入存储在一个向量中,并且我想将该向量发送到命令行。

vector<string> cmd; 
cmd.push_back("id3v2"); 
cmd.push_back("-a " + artist); 
cmd.push_back("-t " + trackTitle); 
cmd.push_back("-A " + albumTitle); 
cmd.push_back("-T " + trackNum); 
system(cmd); 
+1

您可能需要阅读[一个'的std :: system'参考](http://en.cppreference.com/w/cpp/utility/program/system )? –

+0

感谢您的建议。我仍然在努力学习,但很多这些仍然没有意义。 – tj2jz

回答

0

system()期望单个char*串作为输入。您需要将您的std::vector子串连接到一个空格分隔的std::string中,然后将其c_str()方法的返回值传递给system()

std::string join(const std::vector<std::string> &vec, char delim = ' ') 
{ 
    std::ostringstream oss; 
    if (!vec.empty()) 
    { 
     oss << vec[0]; 
     for(size_t idx = 1; idx < vec.size(); ++idx) 
      oss << delim << vec[idx]; 
    } 
    return oss.str(); 
} 

... 

std::vector<std::string> cmd; 
cmd.push_back("id3v2"); 
cmd.push_back("-a " + artist); 
cmd.push_back("-t " + trackTitle); 
cmd.push_back("-A " + albumTitle); 
cmd.push_back("-T " + trackNum); 

system(join(cmd).c_str()); 

或者:

std::ostringstream cmd; 
cmd << "id3v2"; 
cmd << " -a " << artist; 
cmd << " -t " << trackTitle; 
cmd << " -A " << albumTitle; 
cmd << " -T " << trackNum; 

system(cmd.str().c_str()); 
+0

非常感谢,我能够得到它的工作。也许这不是完成这项任务的理想方式,是否有更好的方法来解决这个问题? – tj2jz

+0

@ tj2jz只需追加到单个字符串而不是使用矢量? –

+0

@ tj2jz阅读关于管道处理程序(popen)如果你想读取应用程序的输出 – jamek