كيف يمكنني تشغيل برنامج خارجي من C و تحليل لها الإخراج ؟
-
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;
}