كيف يمكنني تشغيل برنامج خارجي من C و تحليل لها الإخراج ؟

StackOverflow https://stackoverflow.com/questions/43116

  •  09-06-2019
  •  | 
  •  

سؤال

لقد حصلت على الأداة التي النواتج قائمة من الملفات المطلوبة من قبل اللعبة.كيف يمكنني تشغيل هذه الأداة المساعدة في برنامج C والاستيلاء على انتاجها لذلك أنا يمكن أن تعمل على نفس البرنامج ؟

تحديث:الكلمة الطيبة على نقص المعلومات.فائدة يبصق سلسلة من سلاسل, وهذا يفترض أن تكون كاملة المحمولة عبر ماك/ويندوز/لينكس.يرجى ملاحظة, أنا أبحث عن طريقة برمجية لتنفيذ المرافق والاحتفاظ انتاجها (الذي يذهب إلى المعياري).

هل كانت مفيدة؟

المحلول

عن مشاكل بسيطة في Unix العش البيئات محاولة popen().

من صفحة:

على popen() وظيفة يفتح عملية إنشاء أنابيب التفرع و الاحتجاج قذيفة.

إذا كنت تستخدم وضع القراءة هذا هو بالضبط ما طلبته.أنا لا أعرف ما إذا كان يتم تنفيذها في ويندوز.

لمزيد من المشاكل المعقدة التي ترغب في البحث عنها بين عملية الاتصال.

نصائح أخرى

كما أشار آخرون ، popen() هو الأكثر الطريقة القياسية.وبما لا جواب مثالا على استخدام هذا الأسلوب ، من هنا نبدأ:

#include <stdio.h>

#define BUFSIZE 128

int parse_output(void) {
    char *cmd = "ls -l";    

    char buf[BUFSIZE];
    FILE *fp;

    if ((fp = popen(cmd, "r")) == NULL) {
        printf("Error opening pipe!\n");
        return -1;
    }

    while (fgets(buf, BUFSIZE, fp) != NULL) {
        // Do whatever you want here...
        printf("OUTPUT: %s", buf);
    }

    if(pclose(fp))  {
        printf("Command not found or exited with error status\n");
        return -1;
    }

    return 0;
}

popen معتمد على نظام التشغيل ويندوز ، انظر هنا:

http://msdn.microsoft.com/en-us/library/96ayss4b.aspx

إذا كنت تريد أن يكون عبر منصة, popen هو الطريق للذهاب.

حسنا, على افتراض أنك على سطر الأوامر في بيئة ويندوز يمكنك استخدام الأنابيب أو سطر الأوامر الموجهات.فعلى سبيل المثال ،

commandThatOutputs.exe > someFileToStoreResults.txt

أو

commandThatOutputs.exe | yourProgramToProcessInput.exe

ضمن البرنامج الخاص بك ، يمكنك استخدام C الإدخال القياسية وظائف من قراءة البرامج الأخرى الإخراج (scanf ، إلخ.): http://irc.essex.ac.uk/www.iota-six.co.uk/c/c1_standard_input_and_output.asp .يمكنك أيضا استخدام ملف المثال استخدام fscanf.هذا يجب أن تعمل أيضا في يونكس/لينكس.

هذا هو السؤال عام جدا, قد ترغب في تضمين مزيد من التفاصيل ، مثل ما هو نوع من الإخراج هو (مجرد نص أو ملف ثنائي?) و كيف تريد أن عملية.

تحرير:الصيحة التوضيح!

إعادة توجيه المعياري يبدو أن تكون مزعجة ، لقد كان لي أن تفعل ذلك .صافي, و أنه أعطاني كل أنواع الصداع.يبدو المناسبة ج طريقة هي أن تفرخ الطفل عملية الحصول على ملف المؤشر ، وفجأة رأسي يؤلمني.

حتى هيريس هاك يستخدم الملفات المؤقتة.انها بسيطة, ولكن يجب أن تعمل.هذا سوف تعمل بشكل جيد إذا كانت السرعة ليست قضية (ضرب القرص بطيئة) ، أو إذا كان رمي بعيدا.إذا كنت بناء المؤسسة برنامج يبحث في STDOUT إعادة توجيه هو على الارجح أفضل ، وذلك باستخدام ما أوصى.

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    FILE * fptr;                    // file holder
    char c;                         // char buffer


    system("dir >> temp.txt");      // call dir and put it's contents in a temp using redirects.
    fptr = fopen("temp.txt", "r");  // open said file for reading.
                                    // oh, and check for fptr being NULL.
    while(1){
        c = fgetc(fptr);
        if(c!= EOF)
            printf("%c", c);        // do what you need to.
        else
            break;                  // exit when you hit the end of the file.
    }
    fclose(fptr);                   // don't call this is fptr is NULL.  
    remove("temp.txt");             // clean up

    getchar();                      // stop so I can see if it worked.
}

تأكد من التحقق من أذونات الملف:الآن هذا ببساطة رمي الملف في نفس الدليل كملف exe.قد ترغب في النظر في استخدام /tmp في nix, أو C:\Users\username\Local Settings\Temp في ويندوز فيستا ، أو C:\Documents and Settings\username\Local Settings\Temp in 2K/XP.أعتقد /tmp سوف تعمل في OSX, ولكن أنا لم تستخدم واحدة.

في لينكس و OS X ، popen() حقا هو أفضل رهان ، dmckee أشار لأن كلا OSs دعم هذا النداء.في ويندوز ، هذا من شأنه أن يساعد: http://msdn.microsoft.com/en-us/library/ms682499.aspx

وثائق MSDN يقول إذا ما استخدمت في برنامج ويندوز ، _popen الدالة بإرجاع ملف غير صالح المؤشر الذي يسبب البرنامج عن الاستجابة إلى أجل غير مسمى._popen يعمل بشكل صحيح في تطبيق وحدة تحكم.إنشاء تطبيق ويندوز توجيه المدخلات والمخرجات ، راجع إنشاء عملية طفل مع توجيه المدخلات والمخرجات في نظام التشغيل Windows SDK.

يمكنك استخدام system() كما في:

system("ls song > song.txt");

حيث ls هو اسم الأمر على سرد محتويات المجلد الأغنية ، song هو مجلد في الدليل الحالي.الملف الناتج song.txt سيتم إنشاؤها في الدليل الحالي.

//execute external process and read exactly binary or text output
//can read image from Zip file for example
string run(const char* cmd){
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[262144];
    string data;
    string result;
    int dist=0;
    int size;
    //TIME_START
    while(!feof(pipe)) {
        size=(int)fread(buffer,1,262144, pipe); //cout<<buffer<<" size="<<size<<endl;
        data.resize(data.size()+size);
        memcpy(&data[dist],buffer,size);
        dist+=size;
    }
    //TIME_PRINT_
    pclose(pipe);
    return data;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top