system()
またはを使用exec()
すると、任意のコマンドを実行できますが、結果がコンソールに表示されます。コマンドを実行し、出力を抽出して処理してから表示したい。Windows / DOSプラットフォームでこれをどのように達成できますか?
3 に答える
標準Cにはそのようなものはありませんが、通常、POSIXとの互換性のために、コンパイラーはpopen
(_popen
VC ++で)実装します。これは、コマンドを開始し(の場合と同様にsystem
)、要求したストリームにを返しますFILE *
(stdoutを要求できる場合プログラムに入力を与えたい場合は、出力またはstdinを読み取ります)。
を取得したら、通常のファイルの場合と同じように、通常の// ...でFILE *
読み取ることができます。fread
fscanf
入力リダイレクトと出力リダイレクトの両方が必要な場合は、Windowsコンパイラには通常POSIXのようなものがあるため、少し複雑になり始めますが、pipe
完全に互換性はありません(主に、Windowsプロセス作成モデルが異なるため)。
この場合(そして、プレーンpopen
が提供するよりも開始されたプロセスをより細かく制御する必要がある場合)、WindowsでIOリダイレクトを実行する「実際の」方法、つまりCreateProcess
適切なオプションを使用します。たとえば、ここを参照してください。
MatteoItaliaの答えは素晴らしいです。ただし、一部のコンパイラ(特に古いコンパイラ)はをサポートしていませんpopen()
。
popen()
サポートされていない場合、考えられる解決策は次のとおりです。
DOSでは、を使用して出力を一時ファイルにリダイレクトできます>
。
元:
C:\> ipconfig > temp.txt
次に、Cコードでtemp.txtを開い て、そのコンテンツを再処理できます。
このための私のCコードは次のようになります。
system("ipconfig > temp.txt");
FILE *fp;
fp = fopen("temp.txt","r");
// //
//... Code for reprocessing can go here ...//
// //
これは、ほとんどのシステムで機能するはずのpopenを持たない人のための代替の答えです。このコードはスレッドセーフではありません。これはほとんどの状況で重大な制限ではないと思います。
#include <stdio.h>
#include <process.h>
#include <io.h>
#include <sys\stat.h>
#include <assert.h>
int main()
{
int so = dup(1);
close(1);
int i = creat("output.txt", S_IWRITE);
assert(i == 1); // i should be 1...
system("dir");
close(i);
dup2(so, 1);
close(so);
}