4

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

4

3 に答える 3

6

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

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

入力リダイレクトと出力リダイレクトの両方が必要な場合は、Windowsコンパイラには通常POSIXのようなものあるため、少し複雑になり始めますが、pipe完全に互換性はありません(主に、Windowsプロセス作成モデルが異なるため)。

この場合(そして、プレーンpopenが提供するよりも開始されたプロセスをより細かく制御する必要がある場合)、WindowsでIOリダイレクトを実行する「実際の」方法、つまりCreateProcess適切なオプションを使用します。たとえば、ここを参照してください。

于 2012-05-08T16:59:18.337 に答える
2

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 ...//
//                                         //
于 2012-05-08T17:52:24.057 に答える
1

これは、ほとんどのシステムで機能するはずの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);
}
于 2012-06-16T03:24:35.927 に答える