كيفية قراءة/إعادة توجيه إخراج أمر dos إلى متغير برنامج في C/C++؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

أريد تشغيل أمر dos من برنامجي، على سبيل المثال الأمر "dir".أنا أفعل ذلك مثل،

system("dir");

هل هناك أي طريقة لقراءة مخرجات هذا الأمر مباشرة في متغير البرنامج؟

يمكننا دائمًا إعادة توجيه الإخراج إلى ملف ثم قراءة هذا الملف عن طريق القيام بذلك
system("dir > command.out");

ومن ثم قراءة ملف Command.out.ولكن كيف يمكننا القيام بذلك مباشرة بدلاً من إعادة التوجيه إلى ملف ثم القراءة؟

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

المحلول 3

والعثور على وسيلة بديلة أو بالأحرى ما يعادل نوافذ popen. و_popen ذلك (). يعمل هذا الحق فقط بالنسبة لي وعلاوة على ذلك فإنه من السهل أن استخدام.

   char   psBuffer[128];
   FILE   *pPipe;

   if( (pPipe = _popen( "dir", "rt" )) != NULL)
  {
     while(fgets(psBuffer, 128, pPipe))
     {
       printf(psBuffer);
     }
  }

والبحث في التفاصيل مع مثال كامل هنا .

نصائح أخرى

وأنت لا يمكن توجيهها إلى متغير، ولكن يمكنك أن تفعل خدعة مشابهة لكيفية استخدام الأنابيب في يونكس لتسلسل الأوامر. استدعاء CreateProcess() ، وتمريرها على سبيل المثال STARTUPINFO مع تعيين وفقا لمقابض وSTARTF_USESTDHANDLES في STARTUPINFO::dwFlags. ثم قراءة البيانات القادمة من عملية لدت من خلال مجموعة مقابض.

إذا مكتبتك تمت popen() وظيفة POSIX، وهذا ما تحتاجه. يمكنك أن تقرأ إخراج الأمر من الأنابيب وتحليل ذلك وبالطريقة التي تريدها.

FILE *dir;
char direntry[80];

dir = popen("dir", "r");
while (!feof(dir)) {
    fgets(direntry, sizeof(direntry), dir);
    /* do something with direntry */
}

لا يمكنك.تعمل البرامج في مساحات ذاكرة مختلفة، لأنها عمليات مختلفة.بشكل عام، في أنظمة التشغيل الحديثة، لا تقوم العمليات بمشاركة الذاكرة.

أيضًا، سيكون من الصعب تحديد متغير في لغة C يمكنه الاحتفاظ بمخرجات أمر مثل "dir"؛سوف تحتاج إلى النمو ديناميكيًا لإفساح المجال.

أفضل طريقة هي الاستخدام انبوب, ، سيتيح ذلك قراءة مخرجات الأمر من الدفق، حيث يمكنك تخزينه كما تراه مناسبًا.

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

#include <stdio.h>
#include <string>
#include <iostream>

int main()
{
    std::string     output;
    FILE*           data    = popen("cat PLOP","r");

    for(char c = getc(data);c != EOF;c = getc(data))
    {
        output  += c;
    }
    pclose(data);

    std::cout << "Data(" << output << ")\n";
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top