معاملات سطر الأوامر في ++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 .
تعليقات
إرسال تعليق