2017-04-19 117 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