0

system()いくつかのコマンドを実行し、出力を C ドライブの特定のフォルダー内のファイルに保存する C プログラムを作成しました.txt(プログラムは起動権限を持つドメイン クライアントで実行されます)。そこからデータをフィルター処理して表示します。出力コンソール画面。

すべてうまくいきましたが、他のドライブ ( など) に OS がインストールされている PC 用に設計することはできませんでし た。グループ ポリシーにより、一時ファイルを他の場所に書き込むことができません。D:E:C:.txt

このデータを配列変数に直接ストリーミングする方法はありますか? 関数をpopen()実行しましたが、定義するには予測できないサイズの非常に大きな配列が必要になります (system()コマンドの出力が非常に大きくなる可能性があるため)。たとえば、 のレジストリ キーをファイルにエクスポートしHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\uninstallます.txt。そのサイズは最大 50KB 以上です。

    reg export HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\uninstall C:\\..(somewhere)....\\reg_output.txt

大きな出力を持つ類似のコマンドがいくつかあります。Win API プログラミングはまだわからないので、システム コマンドを使用しています。への書き込みに代わる簡単な方法はあります.txtか?


@メガラジ!あなたが使用したように

    char line[100];
    fp = popen("ifconfig eth0", "r");
    fgets(line, 100, fp);

私は使用する必要があります

    char reg_output[100000];
    fp=popen("reg export HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\uninstall ????","r");
    fgets(line,100000,fp);

レジストリ値はどこにエクスポートしますか? (これをエクスポートするためのDOSコマンドはファイルに書き込む必要があるため)、私が使用している次のコードと比較して。

100000 のスペースを割り当てても、エラーが発生しにくいとは限りません。また、大きすぎる値を割り当てると、起動時のメモリにも影響します (よくわかりませんが、そう推測します)。

ファイル処理を使用している間、私はそれを次のように行います:

    char line[5000];   FILE* fp_reg;  int ch,n=0;
    system("reg export HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\uninstall c:\\registries.txt");
    fp_reg=fopen("c:\\registries.txt","r");
    while((ch=fgetc(fp_reg))!=EOF)
    {
        if(isalnum(ch) || ch=='\n')  //allow only alpha numeric & '\n' to pass to array
        { line[n]=ch;
          if(ch=='\n')
          {    filter_for_software(line,n);  //Send the array for filtering function
               n=0;   // Reset the array 'line'
          }
          n++;                
        }    
    }

(私は別の PC に座っているので、ソースからコードをコピーしませんでした。しかし、コードはこれとほぼ同じです。このコードをコピーして実行すると、いくつかのエラーが発生する可能性があります。)ファイルに送信し、フィルタリングして「インストールされているソフトウェアの名前」を取得します。'popen()' でそれを行うにはどうすればよいでしょうか。行を取り出して関数に投げることができます。これについてもコードを書いてください。

4

4 に答える 4

1

Linux でシステム コマンドの値を使用するには popen を使用します。システム コマンド「ifconfig eth0」で文字列/ファイル。例を見る

    void get_my_ip(char *ip_mac_address)
{
    FILE *fp,*output;
    char *start=NULL; 
    char *end=NULL;
    char line[100];
    output=fopen("my_ip_address.txt", "w");
    if(output == NULL) {
        printf("error creating outputfile\n");
        return -1; 
    }

    printf("program to self query the ip address\n");   
    fp = popen("ifconfig eth0", "r");
    fgets(line, 100, fp);
    start=strstr(line, CHECK_STRING_MAC);
    start = start + 7;
    fwrite(start, 1, 17, output); start = NULL;
    fgets(line, 100, fp);
    start=strstr(line, CHECK_STRING_IP);
    start = start + 10;
    fwrite(start, 1, 14, output);
    fclose(output); 
    pclose(fp);
    if( access("my_ip_address.txt", F_OK ) != -1 ) {
        printf("found file having ip address\n");
        output=fopen("my_ip_address.txt", "r");
        fgets(ip_mac_address, 32, output);
    }
    else
        printf("unabe to find file with ip address\n");
    fclose(output);
    printf("my ip and mac address adress is %s \n",ip_mac_address);

}
于 2013-09-12T08:59:34.610 に答える