dosコマンドの出力をC / C ++のプログラム変数に読み書きする方法
質問
たとえば" dir"などのプログラムからdosコマンドを実行したいコマンド。
system("dir");
そのコマンドの出力をプログラム変数に直接読み込む方法はありますか?
次のようにして、出力をいつでもファイルにリダイレクトし、そのファイルを読み取ることができます
system(" dir> command.out");
そして、command.outファイルを読み込みます。しかし、ファイルにリダイレクトしてから読み取るのではなく、どうすれば直接行うことができますか?
解決 3
別の方法、またはpopenに相当するwindowsを見つけました。 _popen()です。これは私にぴったりで、しかも使いやすいです。
char psBuffer[128];
FILE *pPipe;
if( (pPipe = _popen( "dir", "rt" )) != NULL)
{
while(fgets(psBuffer, 128, pPipe))
{
printf(psBuffer);
}
}
詳細な例については、こちら。
他のヒント
変数にリダイレクトすることはできませんが、コマンドをチェーンするためにUnixでパイプを使用する方法に似たトリックを行うことができます。 CreateProcess()
を呼び出しますa>、それに応じてハンドルを設定した STARTUPINFO
インスタンスと、 STARTUPINFO :: dwFlags
の STARTF_USESTDHANDLES
を渡します。次に、セットハンドルを使用して、生成されたプロセスからのデータを読み取ります。
ライブラリにPOSIX関数 popen()
がある場合、それが必要です。パイプからコマンド出力を読み取り、任意の方法で解析できます。
FILE *dir;
char direntry[80];
dir = popen("dir", "r");
while (!feof(dir)) {
fgets(direntry, sizeof(direntry), dir);
/* do something with direntry */
}
できません。プログラムは異なるプロセスであるため、異なるメモリ空間で実行されます。一般的に、最新のオペレーティングシステムでは、プロセスはメモリを共有しません。
また、" dir&quot ;;のようなコマンドの出力を保持できる変数をCで定義することは困難です。スペースを確保するために動的に拡張する必要があります。
最良の方法は、パイプを使用すると、ストリームからコマンドの出力を読み取れるようになります。ストリームからは、必要に応じてコマンドを出力できます。
popen()を使用すると、希望どおりに動作します。
双方向パイプを作成し、プロセスを分岐します。子では、パイプを標準入力および標準出力に接続してから、popen()の最初のパラメーターとして指定されたコマンドを実行します。
#include <stdio.h>
#include <string>
#include <iostream>
int main()
{
std::string output;
FILE* data = popen("cat PLOP","r");
for(char c = getc(data);c != EOF;c = getc(data))
{
output += c;
}
pclose(data);
std::cout << "Data(" << output << ")\n";
}