2017-04-19 6 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サブストリングを一緒にスペース区切りの1つの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

関連する問題