2012-05-08 8 views
4

system()またはexec()を使用すると、コマンドを実行できますが、結果はコンソールに表示されます。コマンドを実行して出力を抽出して処理し、それを表示したい。 Windows/DOSプラットフォームでこれをどのように達成できますか?Cでdosコマンド出力を抽出

+0

が重複する可能性[私はCから外部プログラムを実行し、その出力を解析するにはどうすればよい?](http://stackoverflow.com/q/43116/)、[システムから標準出力キャプチャするための最良の方法( )コマンドを別の関数に渡すことができるようにする](http://stackoverflow.com/q/125828/)、[コンソールの文字列をC言語の文字列に保存する方法(Windowsプラットフォーム)](http:// stackoverflow。 com/q/8959148 /)。 – outis

答えて

6

は、標準Cのそのようなものは何もありませんが、通常は、POSIXとの互換性のために、コンパイラは、実装popenあなたが尋ねたストリームにFILE *をコマンドを開始します(それがsystemで行うように)と返し、(VC++で_popen)あなたがプログラムに何らかの入力をしたい場合には、出力または stdinを読みたい場合は、stdoutを求めることができます。

FILE *を取得したら、通常のファイルと同じように、通常のfread/fscanf/...と読むことができます。

あなたは両方の入力と出力のリダイレクトを持つようにしたい場合は、Windowsのコンパイラは通常はPOSIX pipeよう何かを持っているが、それは完全に互換性がありません(ほとんどのWindowsプロセスの作成のでやるので、物事は、少し複雑になりますし始めますモデルは異なる)。

popenよりも起動したプロセスを制御する必要がある場合は、WindowsのIOリダイレクションを実行するための「実際の」方法を使用してください。CreateProcessと適切なオプション。例えば、 here

+0

恐ろしい答え。 +1 ....私の答えも見てください...それは簡単な方法で解決します。 –

+0

@ahmedtabrez:ありがとうございますが、必要でないときにファイルIO(すべての短所、権限、既存のファイル、エラー処理など)が必要なので、あなたの方法をお勧めしません。 –

1

マテオ・イタリアの答えは素晴らしいです。しかし、一部のコンパイラ(特に古いもの)はpopen()をサポートしていません。

popen()がサポートされていない場合は、次の解決策があります。

DOSでは>を使用して出力を一時ファイルにリダイレクトできます。

例:

C:\> ipconfig > temp.txt 

私はその後、私のC -codeにTEMP.TXTを開き、その内容を再処理することができます。

system("ipconfig > temp.txt"); 
FILE *fp; 
fp = fopen("temp.txt","r"); 
//           // 
//... Code for reprocessing can go here ...// 
//           // 
1

ここでは、ほとんどのシステム上で動作するはずですpopenのない人のための代替の答えだ。このため

マイCコードは次のようになります。このコードはスレッドセーフではありません。私は、これがほとんどの状況にとって重大な制限ではないと考えています。

#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); 
} 
関連する問題