معاملات سطر الأوامر في ++C

معاملات سطر الأوامر

c

ما لم تكن مستخدما للويندوز بصفة دائمة , فأنت علي دراية بمعاملات سطر الأوامر , والتي بها تشغل البرامج من محث الدوس . فهي تستخدم أساس لإدخال اسم ملفات البيانات للتطبيقات . فمثلا يمكنك فتح ملف من برنامج علي النمط التالي :

c> wordprc afile.doc

هنا يعتبر afile.doc معاملا لسطر الأوامر . كيف نجعل برامج السي++ تشغل من سطر الأوامر ؟ إليك البرنامج التالي الذي يتمتع بهذه الميزة .

comline.cpp


 


// comline.cpp


// demonstrates command-line arguments


#include <iostream.h>


#include <conio.h>


 


void main(int argc, char* argv[] )


   {


   cout << "\nargc = " << argc;


 


   for(int j=0; j<argc; j++)


      cout << "\nArgument " << j << " = " << argv[j];


   getche();


   }




وإليك مثال للحوار مع البرنامج من سطر الأوامر :



c>comline uno dos tres





arge = 4



Argument 0 = c:\pp\chapter4\comline.exe



Argument 1 = uno



Argument2 = dos



Argument3 = tres



لقراءة معاملات سطر الأوامر , يجب إدخال معاملين للدالة main() ( لا تنس أنها دالة ككافة الدوال ). المعامل الأول , argc (اختصار argument count ) يمثل عدد المعاملات في سطر الأوامر , وأول هذه المعاملات هو علي الدوام مسار البرنامج المقصود بقية المعاملات هي المدخل من المستخدم , والتي يفصل بينها المسافات , وهي في حالتنا هذه uno, dos, tres .



ويختزن النظام المعاملات علي شكل عبارات نصية في الذاكرة ويشئ مصفوفة مؤشرات للإشارة لهذه العبارات . وفي مثالنا تسمي المصفوفة argv[] (اختصار argument value ) وعلي ذلك فإن argv[0] تمثل المعامل الأول , وargv[1] تمثل المعامل الثاني , وهكذا ويقوم البرنامج بالوصول لهذه العبارات , وإخراجها بواسطة الدوارة التي تستخدم argc كمحدد لعدد دوارتها .



وليست الكلمات argc, argv[] لازمة فيمكنك أن تستخدم غيرها , ولكن العرف جري علي استخدامها واستخدام غيرها سوف يبلبل كل شخص عدا محول الصياغة بطبيعة الحال .



وإليك برنامجا يستخدم معاملات سطر الأوامر في شئ نافع قهو يظهر محتويات ملف ما علي الشاشة أي ينافس أمر الدوس type في وظيفته .






otype.cpp


 


// otype.cpp


// imitates TYPE command


#include <fstream.h>          // for file functions


#include <process.h>          // for exit()


#include <conio.h>


 


void main(int argc, char* argv[] )


   {


   if( argc != 2 )


      {


      cerr << "\nFormat: otype filename";


      exit(-1);


      }


   char ch;                       // character to read


   ifstream infile;               // create file for input


   infile.open( argv[1] );        // open file


   if( !infile )                  // check for errors


      {


      cerr << "\nCan't open " << argv[1];


      exit(-1);


      }


   while( infile.get(ch) != 0 )   // read a character


      cout << ch;                 // display the character


   getche();


   }




يجري البرنامج اختبارا للتأكد من إدخال العدد الصحيح من المعاملات ولا تنس أن المعامل الأول هو دائما المسار للبرنامج otype والثاني هو اسم الملف وإذا لم يتفق ذلك مع ما يدخله المستخدم , فسوف يخرج البرنامج خلال cerr رسالة تخبره بعدم إمكان فتح الملف .



وإذا كان عدد المعاملات صحيحا , وهو في حالتنا 2 فإن البرنامج يحاول فتح الملف المبين في المعامل الثاني (argv[1]) وهنا أيضا إذا لم يتمكن البرنامج من فتح الملف , فإنه يرسل رسالة تحذير بذلك . بعد ذلك تقرأ الدوارة while محارف الملف واحدا بعد الأخر , وترسله للشاشة .



وتميز نهاية الملف بالقيمة 0 وهو أسلوب أخر لاختبار نهاية الملف ويمكن , كما فعلنا من قبل استخدام قيمة كائن الملف ذاته :



While (infile)



{



Infile.get(ch);



Cout << ch;



}



و بإمكانك تغيير الدوارة while بأكملها إلي العبارة :



Cout <<infile.rdbuf();



كما فعلنا في البرنامج ichar2.cpp



الخرج للطابعة



في الدوس يمكنك الإخراج للطابعة بكل يسر فهو قد حدد لكل من أسماء الملفات للمكونات , حتي يمكن التعامل معها كما لو كانت ملفات عادية , علي ما هو مبين بالجدول



جدول أسماء المكونات المادية





















































الاسم



المعدة



Con



الكونسول (لوحة المفاتيح مع الشاشة)



Aux or com1



أول مخرج متسلسل



Com2



ثاني مخرج متسلسل



Prn or



Ipt1



أول طابعة توازي



Ipt2



ثاني طابعة توازي



Ipt3



ثالث طابعة توازي



nul



جهاز غير موجود







وأغلب الطابعات توصل للمخرج المتوازي الأول , لذا فالأسم المخصص لها يكون Ipt1 (يمكن تغير ذلك لو كان نظام الكمبيوتر لديك ذو تنظيم مخالف )



وفي البرنامج التالي نرسل عبارة نصية ورقما إلي الطابعة , مستخدمين الخرج المهيأ بواسطة مؤثر الإخراج .







ezprint.cpp




 




// ezprint.cpp




// demonstrates simple output to printer




 




#include <fstream.h>              // for file streams




#include <conio.h>




 




void main(void)




   {




   char* s1 = "\nToday's winning number is ";




   int   n1 = 17982;




 




   ofstream outfile;              // make a file




   outfile.open("PRN");           // open it for printer




   outfile << s1 << n1 << endl;   // send data to printer




   outfile << '\x0C';             // formfeed to eject page




   getche();





   }






ويمكنك إخراج ما تشاء من مخرجات مهيأة بهذه الطريقة والمحرف '\xOD' يتسبب في إخراج الصفحة من الطابعة .



وهذا الأسلوب لا ينجح إلا مع البرامج العاملة تحت الدوس فليس لك أن تنفذه في بيئة EasyWin الإخراج للطابعة في بيئة الويندوز يخرج عن نطاق هذه المقالات والبرنامج التالي يخرج بيانات ملف علي القرص إلي الطابعة .



 




oprint.cpp


 


// oprint.cpp


// imitates print command


#include <fstream.h>          // for file functions


#include <process.h>          // for exit()


#include <conio.h>


 


void main(int argc, char* argv[] )


   {


   if( argc != 2 )


      {


      cerr << "\nFormat: oprint filename";


      exit(-1);


      }


   char ch;                       // character to read


   ifstream infile;               // create file for input


   infile.open( argv[1] );        // open file


   if( !infile )                  // check for errors


      {


      cerr << "\nCan't open " << argv[1];


      exit(-1);


      }


   ofstream outfile;              // make file


   outfile.open("PRN");           // open it for printer


   while( infile.get(ch) != 0 )   // read a character


      outfile.put(ch);            // write character to printer


   getche();


   }




ويمكنك استخدام هذا البرنامج لإخراج أي ملف نصي للطابعة وهو يعمل كأمر الدوس print .



التسميات: