زيادة تحميل مؤثرات الإدخال والإخراج في ++C

زيادة تحميل مؤثرات الإدخال والإخراج

c

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

englio.cpp


 


// englio.cpp


// overloaded << and >> operators


// UCS Laboratories


 


#include <iostream.h>


#include <conio.h>


 


class Distance                    // English Distance class


   {


   private:


      int feet;


      float inches;


   public:


      Distance()                         // constructor (no args)


     { feet = 0; inches = 0.0; }


      Distance(int ft, float in)         // constructor (two args)


     { feet = ft; inches = in; }


      friend istream& operator >> (istream& s, Distance& d);  


      friend ostream& operator << (ostream& s, Distance& d);


   };


 


istream& operator >> (istream& s, Distance& d)  // get Distance


   {                                            // from user


   cout << "\nEnter feet: ";  s >> d.feet;      // using


   cout << "Enter inches: ";  s >> d.inches;    // overloaded


   return s;                                    // >> operator


   }


 


ostream& operator << (ostream& s, Distance& d)  // display


   {                                            // Distance


   s << d.feet << "\'-" << d.inches << '\"';    // using


   return s;                                    // overloaded


   }                                            // << operator


 


void main()


   {


   Distance dist1, dist2;          // define Distances


   cout << "\nEnter two Distance values:";


   cin >> dist1 >> dist2;          // get values from user


 


   Distance dist3(11, 6.25);       // define, initialize dist3


 


                   // display distances


   cout << "\ndist1 = " << dist1 << "\ndist2 = " << dist2;


   cout << "\ndist3 = " << dist3;


   getche();


   }




وكما تري زيد تحميل المؤثرين << و >> بحيث يمكنك معاملة المتغيرات من النوع distance كأي متغير أخر من متغيرات اللغة الأساسية , كأن تستخدم لها أوامر علي الصورة :



Cin >> sist1 >> dist2;



Cout <<dist1 <<dist2;



وأسلوب تحميل المؤثرين متشابه , وهما يعيدان , بطريق الإشارة , كائنا من النوع istream بالنسبة للمؤثر >> , ومن النوع ostream بالنسبة للمؤثر << . ويتقبل كلاهما معاملين يمررا لهما الحالة بطريقة الإشارة أيضا , المعامل الأول هو كائن من نوع istream في الحالة الأولي , ألا وهو cin , وكائن من النوع ostream في الحالة الثانية و هو الكائن cout أما المعامل الثاني لدالة زيادة التحميل فهو الكائن الكائن المراد إظهاره .



وفي حالة الإدخال , يقوم المؤثر >> بتقبل تدفق من الكائن المعرف في المعامل الأول , ويضعه في عنصر البيانات للكائن المعرف في المعامل الثاني . وفي حالة الإخراج , يقوم المؤثر << باستخلاص البيانات من الكائن المعرف في المعامل الثاني , ويرسله للكائن المعرف في المعامل الأول .



ويجب أن تكون كلتا الدالتين >> operator <<, operator صديقتين للفئة Distance حيث يقع الكائنان الخاصين بكلا من istream, ostream علي الجانب الأيسر من المؤثر .



زيادة التحميل من أجل الملفات



في البرنامج التالي سوف نبين كيف يمكن زيادة تحميل مؤثري الإدخال والإخراج لكي يتعاملا مع الملفات , أسوة بما فعلناه بالنسبة للكائنين cin, cout .



 




englio2.cpp


 


// englio2.cpp


// overloaded << and >> operators can work with files


// UCS Laboratories


 


#include <fstream.h>


#include <conio.h>


 


class Distance                         // English Distance class


   {


   private:


      int feet;


      float inches;


   public:


      Distance()                       // constructor (no args)


     { feet = 0; inches = 0.0; }


      Distance(int ft, float in)       // constructor (two args)


     { feet = ft; inches = in; }


      friend istream& operator >> (istream& s, Distance& d);


      friend ostream& operator << (ostream& s, Distance& d);


   };


 


istream& operator >> (istream& s, Distance& d)  // get Distance


   {                                            // from file or


   char dummy;  // for ('), (-), and (")        // keyboard


                                                // with


   s >> d.feet >> dummy >> dummy >> d.inches >> dummy;


   return s;                                    // overloaded


   }                                            // >> operator


 


ostream& operator << (ostream& s, Distance& d)  // send Distance


   {                                            // to file or


   s << d.feet << "\'-" << d.inches << '\"';    // screen with


   return s;                                    // overloaded


   }                                            // << operator


 


void main()


   {


   char ch;


   Distance dist1;


   ofstream ofile;                     // create and open


   ofile.open("DIST.DAT");             // output stream


 


   do


      {


      cout << "\nEnter Distance: ";


      cin >> dist1;                    // get distance from user


      ofile << dist1;                  // write it to output str


      cout << "Do another (y/n)? ";


      cin >> ch;


      }


   while(ch != 'n');


   ofile.close();                      // close output stream


 


   ifstream ifile;                     // create and open


   ifile.open("DIST.DAT");             // input stream


 


   cout << "\nContents of disk file is:";


   while(1)


      {


      ifile >> dist1;                  // read dist from stream


      if( ifile.eof() )                // quit on EOF


         break;


      cout << "\nDistance = " << dist1;  // display distance


      }


   getche();


   }




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

التسميات: