Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore ++C من البداية الى البرمجة الكيانية

++C من البداية الى البرمجة الكيانية

Published by Abedalrhman Hazem, 2021-04-10 14:35:05

Description: ++C من البداية الى البرمجة الكيانية

Search

Read the Text Version

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ ‫امثله توضح الاعلات عن قالأ الدالة‬ ‫• برنامج لتعريف قالب دالة لجمع مصفوفة من اعداد وحيحة ومصفوفة من اعوداد‬ ‫حقيقية‬ // Example 11.2 #include < iostream > using name space std; template < class T > T sum ( T *array َint n ) { T temp = 0 ; for ( int I = 0 ; I < = n-1 ; I++ ) temp = temp + array [ I ] ; return ( temp ) ; } int sum ( int *a َint n ) ; float sum ( float *b َint n ) ; void main ( ) { int n = 3 َsum1 ; float sum2 ; static int a [ 3 ] = { 1 1 َ 3 َ } ; static float b [ 3 ] = { 1.1 1 َ.2 3 َ.3 } ; sum1 = sum ( a َn ) ; cout << \" sum of the integers = \" << sum1 << endl ; sum2 = sum ( b َn ) ; cout << \"sum of the floating point numbers = \"<< sum2 << endl; return 0; } :22.1 ‫مخرجات البرنامج‬ Sum of the integers = 6 Sum of the floating point numbers = 6.6 ‫) عررف كدالرة عامرة لجمرع قريم‬sum ()( ‫ السابق قالب الدالرة‬11.2 ‫في البرنامج‬ ‫ حي ان عدد العناصر تمرر بواسطة الوسيط‬،‫) عنصر‬n( ‫مصفوفة ذات حجم لغاية‬ 555

‫ من البداية إلى البرمجة الكيانية‬C++ ‫) يسرتدعى‬sum ()( ‫ لاحرظ ان قالرب الدالرة‬،‫الذي يحدد ضرمن وسرائط اسرتدعاء الدالرة‬ ‫مرررتين مرررة لايجرراد مجمرروع الاعررداد الصررحيحة وثانيررة لايجرراد مجمرروع الاعررداد‬ .‫الحقيقية‬ ‫• برنرامج لتعريرف قالرب دالرة لابردال عنصررين مرن نروع بيانرات مختلرف مثرل‬ )float ،int ( // Example 11.3 #include < iostream > Template < class T > T swap (T &first َT &second ) { T temp ; temp = first ; first = second ; second = temp ; return ( 0 ) ; } int swap ( int &a َint &b ) ; float sum ( float &a َfloat &b ) ; void main () { float fx َfy ; int ix َiy ; cout << \" enter any two integers \\n \" ; cin >> ix >> iy ; cout << \" enter any two floating point numbers \\n \" ; cin >> fx >> fy ; swap ( ix َiy ) ; cout << \" after swapping integers \\n \" ; cout << \" ix = \" << ix << \" iy = \" << iy << endl ; swap ( fx َfy ) ; cout << \" after swaping floting point numbers \\n \" ; cout << \" fx = \" << fx << \" fy = \" << fy << endl ; return 0; } 556

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ 22.3 ‫مخرجات البرنامج‬ Enter any two integers 10 20 enter any two floating point numbers -11.22 33.33 After swaping integers ix = 20 iy = 10 After swaping floating point numbers fx = 33.330002 fy = -11.22 ‫) المخصو لايجواد مربوع أي رقو موع‬square ()( ‫• برنامج لتوضي قالب الدالوة‬ ‫اختلاف نوع بياناتة‬ // Example 11.4 #include < iostream > template < class T > T square ( T one ) } { t one ; return ( one * one ) ; int square ( int ) ; float square ( float ) ; double square ( double ) ; void main () { double z َ zsq ; int x َ xsq ; float y َ ysq ; cout << \" enter an integer \\n \" ; cin >> x ; cout << \" enter an floating point number \\n \" ; cin >> y ; cout << \" enter a double precision number \\n \" ; cin >> z ; xsq square ( x ) ; cout << \" x= \"<< x<<\" and its square = \" << xsq << endl ; ysq square ( y ) ; cout << \" y= \"<< y<<\" and its square = \" << ysq << endl ; zsq square ( z ) ; cout << \" z= \"<< z<<\" and its square = \" << 557

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫; ‪zsq << endl‬‬ ‫;‪return 0‬‬ ‫}‬ ‫مخرجات البرنامج ‪22.4‬‬ ‫‪Enter an integer‬‬ ‫‪21‬‬ ‫‪Enter floating point number‬‬ ‫‪211.11‬‬ ‫‪Enter a double precision number‬‬ ‫‪2111.22‬‬ ‫‪X = 10 and its square = 100‬‬ ‫‪Y = 100.110001 and its square = 10022.012695‬‬ ‫‪Z = 1000.22 and its square = 1000440.0484‬‬ ‫‪ 22.6‬قالب الصنف ‪Class Template‬‬ ‫طريقرة الاعرلان عرن قالرب الصرنف هري مشرابهة لطريقرة الاعرلان عرن قالرب‬ ‫الدالرة‪ .‬ومثرل قالرب الدالرة فران الكلمرة المفتاحيرة (‪ )template‬يجرب ان تحشرر كرأول‬ ‫عبارة لتعريف قالب الصنف‪ ،‬القاعدة العامة لقالب الصنف هي‬ ‫> ‪template < class T‬‬ ‫‪class user-defined-name‬‬ ‫‪{ private:‬‬ ‫‪…………..‬‬ ‫‪Public:‬‬ ‫‪………….‬‬ ‫;}‬ ‫الصنف سيكون له اعضاء يستخدمون وسائط القالب كنوع‪ :‬مثال‬ ‫>‪template <class T‬‬ ‫{ ‪class mypair‬‬ ‫;]‪T values [2‬‬ ‫‪public:‬‬ ‫)‪mypair (T first ،T second‬‬ ‫{‬ ‫;‪values[0]=first‬‬ ‫‪558‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫;‪values[1]=second‬‬ ‫}‬ ‫;}‬ ‫الصرنف الرذي ترم تعرفيرة اعرلا يخردم امكانيرة الخرزن لعنصررين مرن اي نروع‬ ‫مقبول‪ .‬مثال‪ ،‬اذا اردنرا ان نعلرن عرن كيران مرن هرذا الصرنف لخرزن قيمترين مرن نروع‬ ‫الاعداد الصحيحة قيمهم هي (‪ )75 ،111‬فانك ستكتب‪:‬‬ ‫; )‪mypair<int> myobject (100, 75‬‬ ‫نفب هذا الصنف من الممكن ان تستخدمه لخلق اي كيان لخزن أي نوع اخر‪.‬‬ ‫;)‪mypair<double> myfloats (2.0, 3.28‬‬ ‫فقرط الدالرة العضرو فري قالرب الصرنف السرابق يمكرن ان يعررف كدالرة (‪)inline‬‬ ‫داخل اعلان الصنف نفسه‪ .‬في حالة تعريف الدالة العضو خارج الاعرلان عرن قالرب‬ ‫الصنف‪ ،‬فانك يجب دائما ان تسبق هذا التعريف بسابقة )>…< ‪.(template‬‬ ‫• برنامج لايجاد العدد الاكبر بين عددين باستخدام قوالب الصنف‬ ‫‪// Example 11.5‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫>‪template <class T‬‬ ‫{ ‪class Mypair‬‬ ‫;‪T a, b‬‬ ‫}‬ ‫‪public:‬‬ ‫)‪Mypair (T first َ T second‬‬ ‫; ‪{ a = first ; b = second‬‬ ‫;) ( ‪T getmax‬‬ ‫;}‬ ‫>‪template <class T‬‬ ‫)( ‪T Mypair<T>::getmax‬‬ ‫{‬ ‫;‪T retval‬‬ ‫;‪retval = a>b? a : b‬‬ ‫;‪return retval‬‬ ‫}‬ ‫‪559‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫{ )( ‪int main‬‬ ‫;)َ ‪Mypair <int> myobject (10075‬‬ ‫;)(‪cout << myobject.getmax‬‬ ‫;‪return 0‬‬ ‫}‬ ‫نتيجة البرنامج ‪22.5‬‬ ‫‪211‬‬ ‫لاحظ الصيغة القواعدية لتعريف الدالة العضو )‪.(getmax‬‬ ‫>‪template <class T‬‬ ‫)( ‪T Mypair<T>::getmax‬‬ ‫ربما يحدث تشويش بكثرة استخدام )‪ (T‬في هذا المثال‪ ،‬واقعا هنرا ثلاثرة (‪(T‬‬ ‫فري هرذا الاعرلان‪ :‬الاول هرو وسريط القالرب‪ .‬الثراني يشرير الرى النروع المعراد بواسرطة‬ ‫الدالة‪ ،‬اما الثال (والذي هو بين قوسي الزاوية > <) هرو ايضرا مطلروب‪ :‬فهرو يحردد‬ ‫بان وسائط قوالب الدوال هذ هي ايضا وسائط قالب الصنف‪.‬‬ ‫كمثال مقطع البرنامج التالي يوضح كيفية تعريف واعلان قالب الصنف‬ ‫> ‪#include < iostream‬‬ ‫;}‬ ‫> ‪template < class T‬‬ ‫{ ‪class Sample‬‬ ‫‪private :‬‬ ‫; ‪T value َvalue1 َvalue2‬‬ ‫‪public :‬‬ ‫; )( ‪void getdata () ; void sum‬‬ ‫{ )( ‪void main‬‬ ‫; ‪Sample < int > obj1‬‬ ‫; ‪Sample < float > obj2‬‬ ‫} ………………………‬ ‫عندما يتم تعريف قالب الصنف‪ ،‬فانه يحتاج لتخصيص كيان صنف باسرتخدام‬ ‫محفز خاص او نوع التعريف المستخدم لاستبدال انواع الوسائط‪.‬‬ ‫‪561‬‬

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ ‫) طالمرا‬template( ‫الدالة العضو لقالب الصنف تحتوي ايضا الكلمرة المفتاحيرة‬ .‫يتم الاعلان عنها خارج مدى الصنف‬ ‫• برنامج يوض كيفية الاعلان عن الدوال الاعضاء لقالب الصنف‬ // Example 11.6 #include < iostream > template < class T > class Sample { private : T value َvalue1 َvalue2 ; public : void getdata () ; void sum () ; } ; template < class T > void Sample < T > :: getdata () { cin >> value1 >> value2 ; } template < class T > void Sample < T > :: sum () { T value ; value = value1 + value2 ; cout << \" sum of = \" << value << endl ; return 0; } ‫• برنامج لتوضي كيفية اعلان وتعريف قالب ونف لقوراءة عنصوري بيانوات اثنوان‬ ‫ وايجاد مجموع أي اثنان من البيانات المعطاة‬, ‫من لوحة المفاتي‬ // Example 11.7 }; #include < iostream > template < class T > class Sample { private : T value َvalue1 َvalue2 ; public : void getdata () ; void sum () ; template < class T > void Sample < T > :: getdata () { cin >> value1 >> value2 ; } 561

‫ من البداية إلى البرمجة الكيانية‬C++ template < class T > void Sample < T > :: sum () { T value ; value = value1 + value2 ; cout << \" sum of = \" << value << endl ; } void main () { Sample < int > obj1 ; Sample < float > obj2 ; cout << \" enter any two integers : \" << endl ; obj1.getdata() ; obj1.sum() ; cout << \" enter any two floating point numbers : \" << endl ; obj2. getdata () ; obj2.sum () ; return 0; } 22.7 ‫مخرجات البرنامج‬ Enter any two integers : 21 20 Sum of = 30 Enter any two floating point numbers : 22.11 22.22 Sum of = 33.329998 ‫• برنووووامج يوضوووو كيفيووووة الاعوووولان وتعريووووف قالووووب ووووونف مووووع دالووووة بنوووواء‬ // Example 11.8 } ‫) افتراضي‬constructor( #include < iostream > template < class T > // ‫بناء افترايي‬ class Sample { private : T value ; public : Sample ( T = 0 ) { void display () } { cout << \" default constructor is called \" << endl ; cout << \" contents of the value = \" << value << endl ; 562

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ }; obj1.display () ; void main () { obj2.display () ; Sample < int > obj1 ; Sample < float > obj2 ; return 0; } 11.8 ‫مخرجات البرنامج‬ Default constructor is called Contents of the value = 8838 Default constructor is called Contents of the value = 4.250073 e -17 ‫• برنامج لتوضي كيفية الاعلان وتعريف قالب ونف مع دالة بناء عضو‬ // Example 11.9 #include < iostream > Template < class T > class Sample { Private : T value ; public : Sample { } // ‫بناء‬ void display () { cout << \" constructor is called \" << endl ; cout << \" contents of the value = \" << value << endl ; } }; void main () { Sample < int > obj1 ; obj1.display () ; Sample < float > obj2 ; obj2.display () ; return 0; } ‫• برنامج لبيان كيفية الاعلان وتعريف قالب ونف مع دالة عضو للبناء والهدم‬ // Example 11.10 #include < iostream > Template < class T > class Sample { 563

‫ من البداية إلى البرمجة الكيانية‬C++ Private : T value ; public : //‫دالة هدلأ‬ //‫بناء‬ Sample { } ~Sample() void display () { cout << \" constructor is called \" << endl ; cout << \" contents of the value = \" << value << endl ; } } ; void main () { Sample < int > obj1 ; obj1.display () ; Sample < float > obj2 ; obj2.display () ; return 0; } ‫ بنواء‬،‫• برنامج لبيان كيفية الاعلان وتعريف قالوب وونف موع دوال اعضواء خاووة‬ )‫وهدم (دالة البناء تحتوي على وسيط واحد مع وي مختلفة‬ // Example 11.11 #include < iostream > template < class T > class Sample { Private : T value ; public : //‫بناء‬ Sample ( T n ); ~Sample ( ) { } void display () ; }; template < class T > Sample < T > :: Sample ( T n ) : value ( n ) { } template < class T > ~ Sample < T > :: ~Sample () { } template < class T > void Sample < T < :: display () { cout << \" content of the value = \" << value << endl ; } void main () { Sample < int > obj1 ( 10 ) ; cout << \" integer : \" << endl ; obj1.display () ; Sample < float > obj2 ( -22.12345 ) ; cout << \" floating point number : \" << endl ; 564

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ obj2.display() ; Sample < double > obj3 ( 12345678L ) ; cout << \" Double precision number : \" << endl ; obj3.display () ; return 0; } //:22.22 ‫مطرجا البرنامج‬ Integer : Content of the value = 10 Floating point number : Content of the value = -22.123449 Double precision number : Content of the value = 12345678 ،‫• برنامج لتوضي كيفيوة الاعولان وتعريوف قالوب وونف موع دوال اعضواء خاووة‬ )‫بناء وهدم (دالة البناء تحتوي على وسيط واحد‬ // Example 11.12 #include < iostream > template < class T > class Sample { Private : T value ; public : //‫بناء‬ Sample ( T n ) : value ( n ) { } ; ~Sample () { } // destructor void display () { cout << \" contents of the value = \" << value << endl ; } } ; void main () { Sample < int > obj1 ( 10 ) ; cout << \" integer : \" << endl ; obj1.display () ; 565

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫; ) ‪Sample < float > obj2 ( -22.12345‬‬ ‫; ‪cout << \" floating point number : \" << endl‬‬ ‫; )(‪obj2.display‬‬ ‫;‪return 0‬‬ ‫}‬ ‫مخرجات البرنامج ‪22.21‬‬ ‫‪Integer :‬‬ ‫‪Content of the value = 10‬‬ ‫‪Floating point number = -22.123449‬‬ ‫‪ 22.7‬التعامل مع الاستثناءات ‪Exception Handling‬‬ ‫الاستثناءات هي اخطاء او حدث غيرر مقبرول‪ ،‬وللتعامرل مرع هرذ الاسرتثناءات‬ ‫فانرك تسرتخدم مجموعرة مرن الشرفرات التري تنفرذ عنردما يحردث اسرتثناء‪ .‬التعامرل مرع‬ ‫الاسرتثناءات هري واحردة مرن الصرفات الحديثرة التري اضريفت الرى ‪ C++‬والتري ربمرا‬ ‫لاتكون مدعومة من النسر القديمرة لمتررجم ‪ .C++‬التعامرل مرع الاسرتثناءات فري لغرة‬ ‫‪ C++‬يوفر افضل طريقة بحي ان مستدعي الدالرة ممكرن ان يعلرم بران هنرا اخطراء‬ ‫قد حدثت‪.‬‬ ‫واحدة من طرق كتابة البرنرامج هرو اولا افتررا ان لاشريء غيرر طبيعري او‬ ‫غير صحيح سوف يحدث‪ ،‬فمثلا اذا كتبت برنامج له مدخلات من قائمة‪ ،‬المفررو‬ ‫ان تكون القائمة غير فارغة‪.‬‬ ‫عادة نتصور ان البرنرامج كترب للحرالات المثاليرة‪ ،‬حير ان كرل الامرور تسرير‬ ‫وفق المخطط‪ ،‬ومن ثم بامكانك ان تضيف شفرة للحالات الاستثنائية‪.‬‬ ‫‪566‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫في ‪ C++‬هنا طريقة لعكب هذ الطريقة بكتابرة الشرفرة‪ .‬اساسرا‪ ،‬فانرك تكترب‬ ‫الشفرة كما لو ان لاشريء غيرر طبيعري سريحدث‪ ،‬بعرد ذلرك فانرك ستسرتخدم تسرهيلات‬ ‫معالجة الاستثناءات لأضافة شفرة الى تلك الحالات غير الاعتيادية‪.‬‬ ‫التعامل مع الاستثناءات يستخدم بشكل عرام للتعامرل مرع حرالات الخطرأ‪ ،‬ولكرن‬ ‫ربما افضرل طريقرة لعرر الاسرتثناءات‪ ،‬هري طريقرة معالجرة الحرالات الاسرتثنائية‪،‬‬ ‫وبعد ذلك اذا تعاملت شفرتك مع الاخطاء بشكل صحيح فسوف لايكرون هنرا خطرأ‪.‬‬ ‫من الممكن والاكثر اهميرة لاسرتخدام الاسرتثناءات هرو التعامرل مرع الردوال والتري لهرا‬ ‫بعرض الحرالات الخاصرة التري تتعامرل بشركل مختلرف اعتمرادا علرى كيفيرة اسرتخدام‬ ‫الدالرة‪ .‬ربمرا تسرتخدم الدالرة ببررامج عديردة‪ ،‬بعضرها سروف تتعامرل مرع حالرة خاصرة‬ ‫بطريقة واحدة وبعضها سوف تعاملة بطريقة اخرى‪.‬‬ ‫مثرال‪ ،‬اذا كران هنرا احتمرال القسرمة علرى صرفر فري الدالرة‪ ،‬عليره فران الدالرة‬ ‫تنهيرة وسرروف ينتهري البرنررامج‪ ،‬ولكرن فرري حرالات اخرررى للدالرة شرريء اخرر ربمررا‬ ‫سيحدث‪ ،‬سوف ترى دالة ما مرن الممكرن ان تعررف لتنشريط )‪ (throw‬اسرتثناء اذا مرا‬ ‫حدثت حالة خاصة‪ ،‬وهذا الاستثناء سوف يسمح للحالة الخاصة للتعامل معها خرارج‬ ‫الدالرة‪ .‬بهرذ الطريقرة الحالرة الخاصرة مرن الممكرن ان تعامرل بشركل مختلرف لحرالات‬ ‫الاستدعاء المختلفة للدالة في‪.C++‬‬ ‫التعامل مع الاستثناء يتكون من ثلاث أجزاء‪:‬‬ ‫‪ .1‬اكتشاف اخطاء وقت التنفيذ‪.‬‬ ‫‪ .2‬رفع استثناء استجابة للخطأ‪.‬‬ ‫‪ .3‬اتخاذ فعل التصحيح‪ .‬الاخير يدعى ازالة ‪.recovery‬‬ ‫بعض الاستثناءات من الممكن ان تزال بشركل كامرل بحير ان التنفيرذ يسرتمر‬ ‫ولايتاثر‪ .‬مثال‪ ،‬قيمة وسيط غير مقبولة تمررر الرى الدالرة يمكرن ان تعرالج بتعويضرها‬ ‫مع قيم افتراضية‪ .‬استثناء اخر من الممكرن ان يعرالج جزئيرا‪ .‬مثرال‪ ،‬اسرتهلا لرذاكرة‬ ‫الهيرب ‪ Heap memory‬ممكرن ان تعرالج بواسرطة ترر العمليرة الحاليرة والعرودة الرى‬ ‫الحالرة التري تكرون فيهرا عمليرات اخررى لاترؤثر بالرذاكرة (مثرل خرزن الملرف الحرالي‬ ‫‪567‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫المفترروا لتجنررب فقرردان محتوياترره)‪ C++ .‬ترروفر تسررهيلات لغررة لمعالجررة الاسررتثناء‬ ‫بانتمام‪ .‬تحت هذا المنمور فان مقطرع مرن الشرفرة الرذي ينفرذ ربمرا يقرود الرى اخطراء‬ ‫وقت التنفيذ يؤشر على انه كتلرة العمرل ‪ .try block‬اي جرزء مرن الشرفرة ينشرط اثنراء‬ ‫تنفيرذ كتلرة العمرل ‪ try‬ممكرن ان يصردر اسرتثناء باسرتخدام مقطرع التنشريط ‪throw‬‬ ‫‪ .clause‬كرل الاسرتثناءات تطبرع (بمعنرى الاسرتثناء يرمرز لره بواسرطة كيران مرن نروع‬ ‫خاص)‪ .‬كتلة ‪ try‬تكون متبوعرة بواحرد او اكثرر مرن مقراطع المعالجرة ‪catch clauses‬‬ ‫كل مقطع معالجة ‪ catch clause‬يكون مسؤول عرن معالجرة اسرتثناء مرن نروع معرين‪.‬‬ ‫فعنردما يصردر اسرتثناء‪ ،‬فران نوعرة يقرارن مرع مقراطع المعالجرة ‪ catch clauses‬الرذي‬ ‫يتبعة‪ .‬فاذا تم ايجاد مقاطع ‪ clauses‬تتطابق معه عليه فران مقطرع المعالجرة هرذا ينفرذ‪،‬‬ ‫في خلاف ذلك فان الاستثناء يتنامى لتحديد كتلة العمل ‪ try‬مباشرة (ان وجدت)‪ .‬هذ‬ ‫العمليرة تكررر لغايررة ان ترتم معالجررة الاسرتثناء بتطررابق ‪ catch clause‬او ان تعررالج‬ ‫بواسطة المعالج الافتراضي‪.‬‬ ‫الكلمات المفتاحية التالية تستخدم للتعامل مع اخطاء الدوال في ‪C ++‬‬ ‫‪Try ، Catch ، Through‬‬ ‫فعندما يتم اكتشاف خطأ مرن قبرل مسرتدعي الدالرة (ولرم ترتم الاسرتعانة بطريقرة‬ ‫معالجة الاستثناءات) فسيكون من الصعب جدا التعامل معها في البرامجيرات الكبيررة‬ ‫والمعقدة‪ .‬البرنامج يجرب ان يطرور للتعامرل مرع الاسرتثناءات بطريقرة تحردد الاخطراء‬ ‫المحتملة التي من الممكن للبرنامج ان يقوم بها وعليه سيضع ضرمنا الشرفرة اللازمرة‬ ‫للتعامل مع الاستثناءات‪.‬‬ ‫ملاحظة ‪//:‬‬ ‫الاستثناءات هي اخطاء وقت التنفيذ والتي تحردث (الاخطراء) بسربب حالرة‬ ‫غير طبيعية‬ ‫معالجة الاستثناءات يسير كمايلي‪ :‬امرا بعرض البرامجيرات المكتبيرة او شرفرتك‬ ‫تولرد أليرة بحير تؤشرر عنردما يحردث اي شريء غيرر طبيعري وهرذ نسرميها (تنشريط‬ ‫‪568‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫الاستثناء) (‪ .)throw‬وفي مكان اخر في البرنامج فانك تضع شرفرة تتعامرل مرع حالرة‬ ‫الاستثناء وهي الشفرة الخاصة بكتلة ‪ ،catch‬هذ تدعى معالجة الاستثناء‪.‬‬ ‫عندما تنشط عبارة ‪ throw‬فان تنفيذ الكتلة المحددة للامر (‪ )try‬سوف تتوقف‪.‬‬ ‫فاذا كانت كتلرة ‪ try‬متبوعرة بكتلرة (‪ )catch‬مناسربة‪ ،‬عليره فران المسريطر سرينتقل الرى‬ ‫كتلرة ‪ .catch‬ان عبرارة ‪ throw‬هري غالبررا ودائمرا تخفرى فرري عبرارات التفررع‪ ،‬مثررل‬ ‫عبارات )‪ .(if‬ان قيم التنشيط (‪ )thrown‬ممكن ان تكون من اي نوع‪.‬‬ ‫‪ 11.8‬وسيط كتلة )‪)Catch –Block Parameter catch‬‬ ‫وسيط كتلة ‪ catch‬هو معرف في راس كتلة ‪ catch‬والذي يعمرل كمكران لحمرل‬ ‫قيمرة الاسرتثناء الرذي سينشرط (‪ ،)thrown‬فعنردما تنشرط قيمرة (مناسربة) فري كتلرة ‪try‬‬ ‫السرابقة فران هرذ القيمرة ستسرند لوسريط كتلرة ‪ ,catch‬بامكانرك اسرتخدام اي معررف‬ ‫مقبول (ليب من الكلمات المحجوزة) لوسيط كتلة ‪. catch‬‬ ‫)‪catch (int e‬‬ ‫; ”‪{ cout << e << “ donut’s ، and no milk!\\n” <<”Go buy some milk.\\n‬‬ ‫}‬ ‫هنا المتغير ‪ e‬هو وسيط كتلة ‪catch‬‬ ‫‪ 22.9‬الاستثناءات ‪try – throw – catch‬‬ ‫الاليررة الاساسررية للاسررتثناءات (‪ )catching, throwing‬تعتمررد علررى تنشرريط‬ ‫الاسرتثناء مرن خرلال عبرارة ‪( throw‬تعطري قيمرة)‪ ،‬كتلرة ‪ catch‬تسرتجيب للاسرتثناء‬ ‫(تتحسب القيمة)‪ ،‬فعندما ينشط الاسرتثناء فري كتلرة ‪ ،try‬فسريتم انهراء التنفيرذ فري كتلرة‬ ‫‪ try‬وينتقل المسيطر الى كتلة ‪ catch‬لتنفيذ الشفرة فري كتلرة ‪ catch‬وبعرد اكتمرال تنفيرذ‬ ‫كتلة ‪ catch‬فان المسيطر سوف لايعود الى كتلة ‪ try‬وانما يسرتمر بتنفيرذ الشرفرة التري‬ ‫بعرد كتلرة‪/‬كترل ‪( catch‬تروفير كترل ‪ catch‬لاتنهري البرنرامج او تنجرز بعرض الافعرال‬ ‫الخاصة الاخرى)‪ .‬اما اذا لم يتم تنشيط استثناء في كتلة ‪ ، try‬عليه فبعد اكتمرال كتلرة‬ ‫‪ try‬فان البرنامج يستمر بتنفيذ الشفرة التي بعد كتلة‪/‬كتل ‪( catch‬بكلام اخر اذا لم يرتم‬ ‫تنشيط استثناء فان كتل ‪ catch‬ستهمل)‬ ‫‪569‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫الصيغة القواعدية‪:‬‬ ‫‪try‬‬ ‫{‬ ‫‪Some-statements‬‬ ‫او اسررتدعاء دالررة ربمررا تنشررط اسررتثناء (‪ )throw‬امررا الشررفرات مررع عبررارة‬ ‫‪Some-more-statements‬‬ ‫}‬ ‫)‪Catch (type-name e‬‬ ‫{‬ ‫(الشفرة توفر اذا قيمة نوع وسيط كتلة ‪ catch‬ينشط في كتلة ‪(try‬‬ ‫}‬ ‫الاستثناءات توفر طريقة للتفاعل مع المرروف الاسرتثنائية (مثرل اخطراء وقرت‬ ‫التنفيررذ) فرري برنامجررك وذلررك بنقررل السرريطرة الررى دوال خاصررة ترردعى المعالجررات‬ ‫)‪ .(handlers‬لمسررك الاسررتثناءات يجررب ان تضررع جررزء مررن الشررفرة تحررت مراقبررة‬ ‫الاسرتثناء‪ .‬هرذ تقروم بهرا بوضرع جرزء الشرفرة فري كتلرة ‪ .try‬فعنردما يحردث ظررف‬ ‫اسرتثنائي فري هرذ الكتلرة‪ ،‬فران الاسرتثناء سينشرط والرذي سرينقل المسريطر الرى معرالج‬ ‫الاسررتثناء‪ .‬امررا اذا لررم ينشررط اسررتثناء‪ ،‬فرران الشررفرة ستسررتمر بشرركل اعتيررادي وكررل‬ ‫المعالجات ستهمل‪ .‬الاستثناء ينشط وذلك باستخدام الكلمة المفتاحية ‪ throw‬من داخل‬ ‫كتلة ‪ .try‬معالجات الاستثناء يعلن عنها مرع الكلمرة المفتاحيرة ‪ ،catch‬والتري يجرب ان‬ ‫توضع مباشرة بعد كتلة ‪.try‬‬ ‫• برنامج يوضح طريقة استخدام الاستثناء‬ ‫‪// Example 11.13‬‬ ‫>‪#include <iostream‬‬ ‫‪571‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫;‪using namespace std‬‬ ‫{ )( ‪int main‬‬ ‫‪try‬‬ ‫{‬ ‫;‪throw 20‬‬ ‫}‬ ‫)‪catch (int e‬‬ ‫{‬ ‫<< ‪cout << \"An exception occurred. Exception No. \" << e‬‬ ‫;‪endl‬‬ ‫}‬ ‫;‪return 0‬‬ ‫}‬ ‫نتيجة البرنامج ‪22.23‬‬ ‫‪An exception occurred. Exception No. 20‬‬ ‫الشفرة تحت معالجة الاستثناء وضعت في كتلة ‪ .try‬فري البرنرامج ‪ 11.13‬هرذ‬ ‫الشفرة ببساطة تنشط استثناء‪:‬‬ ‫;‪throw 20‬‬ ‫عبرارة ‪ throw‬تقبرل وسريط واحرد (فري هرذ الحالرة قيمرة العردد الصرحيح ‪،)21‬‬ ‫والذي يمرر كوسيط الى معالج الاستثناء‪.‬‬ ‫معالج الاستثناء يعلن عنه مع الكلمة المفتاحية ‪ .catch‬كما يمكن ان ترى‪ ،‬فانه‬ ‫يتبع مباشرة القوس المغلق للكتلة ‪.try‬‬ ‫‪571‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫صريغة ‪ catch‬هري مشرابهة الرى الدالرة الاعتياديرة التري لهرا دائمرا علرى الاقرل‬ ‫وسيط واحد‪ ،‬نوع هذا الوسيط مهم جدا‪ ،‬حي ان نروع الوسريط الرذي يمررر بالعبرارة‬ ‫‪ throw‬سيتم فحصة وفقا له‪ ،‬وفقط في حالة تطابقهما‪ ،‬فان الاستثناء سيحدث‪.‬‬ ‫بالامكان ان ترربط كسلسرلة عردد مرن المعالجرات (عبرارات ‪ ،)catch‬كرل واحرد‬ ‫منهم مع نروع وسريط مختلرف‪ .‬فقرط المعرالج الرذي يتطرابق نوعرة مرع الوسريط المحردد‬ ‫بعبارة ‪ throw‬سينفذ‪.‬‬ ‫‪ 22.21‬تعريف اوناف استثناء خاوة ب‬ ‫‪Defining your own Exception Classes‬‬ ‫عبارة ‪ throw‬من الممكن ان تنشط قيم مرن اي نروع‪ ،‬الشريء العرام لعمرل هرذا‬ ‫هررو لتعريررف صررنف لرره كيانررات مررن الممكررن ان تحمررل انررواع خاصررة دقيقررة مررن‬ ‫المعلومرات تريرد ان تنشرطها فري كتلرة ‪ ،catch‬ومرن الاسرباب الاكثرر اهميرة لتعريرف‬ ‫صنف استثناء خاص هو لتمكينك من تملك نوع مختلف لتعريف كل نوع ممكرن مرن‬ ‫حرالات الاسرتثناء‪ .‬صرنف الاسرتثناء هرو مجررد صرنف‪ ،‬مايجعلرة صرنف اسرتثناء هرو‬ ‫كيفية استخدامة‪ .‬لازال يجب ان تنتبة باختيار اسم صنف الاستثناء وكرذلك التفاصريل‬ ‫الاخرى‪.‬‬ ‫مثال‪ ،‬في البرنامج الذي يقروم بعمليرة الادخرال والاخرراج فري معالجرة الملفرات‬ ‫فانه من الضروري ان يتم فحص عملية فتح الملف فيما اذا تمت عملية الفرتح بنجراا‬ ‫ام لا وعر رسالة الخطأ المناسبة اذا ما حدث أي خطرأ غيرر متوقرع‪ .‬الاسرتثناءات‬ ‫توفر طريقة اخرى لنقل المسيطر والمعلومات من الموقع الحرالي فري تنفيرذ البرنرامج‬ ‫الى الاستثناءات‪ .‬الاستثناءات يتم تنشيطها او تنشيطها فقط بواسطة التعبير (‪)throw‬‬ ‫بشفرة تنفذ داخل كتلة العمل (‪ )try‬او ان الدالة تستدعى مرن كتلرة العمرل (‪ .)try‬عرادة‬ ‫الاستثناءات تتكون من ثلاث كتل هي‬ ‫‪try block ، handle ، throw expression‬‬ ‫القاعدة العامة للاستثناءات تعطى بواسطة‬ ‫‪572‬‬

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ try (expression) catch (expression detector) { ……………. } throw (expression) { …….. // ‫} رسالة خطأ‬ ‫) مرن‬unary( ‫) هرو تعبيرر احرادي‬throw( ‫ بينمرا التعبيرر‬،‫) هي عبارة‬try( ‫كتلة‬ .)void( ‫نوع‬ ‫• مقطع البرنامج التالي يوض كيفية الاعلان وتعريف الاستثناءات في البرنامج‬ Class Sample { private : char *str ; public : enum { minsize = 1 َ maxsize = 1000 ) ; Sample () ; Sample ( int ) ; void display () ; } ; Sample :: Sample ( int size ) { if ( size < minsize || size > maxsize ) throw ( size ) ; str = new char [ size ] ; if ( str = = 0 ) throw ( \" out of memory \\n \" ) ; } void funct ( int n ) { //‫َ كياإ‬ try { Sample obj ( n ) ; } catch ( int k ) { cerr << \" out of range ….. \\n \" ; func ( Sample :: maxsize ) ; } func‫نهاية تدريف الدالة‬ } // ‫ تحديات تنفي معالج الاستثناء‬22.22 The Challenges of Implementation of Exception Handling ‫الصعوبات في تنفي معالج الاستثناء تبرز من عدد من العوامل‬ ‫ يجووووب ان يووووت التاكوووود موووون وجووووود شووووفرة المعالجووووة المناسووووبة‬.. ‫ التنفيوووو‬:‫الاول‬ .‫لاستثناء معين‬ 573

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫ثانيا‪ :‬كيانات الاستثناء ممكن ان تكون متعددة الاشكال ‪.. polymorphic‬في هو ه‬ ‫الحالة‪ ،‬التنفي ايضا ياخ بنظر الاعتبوار المعالجوات التوي اساسوها الصونف عنودما‬ ‫لايمكنها ايجاد المعالج المطوابك للكيوان المشوتك‪ ..‬هو ه المتطلبوات تتضومن ترتيوب‬ ‫لفح (من نووع وقوت التشوغيل) لازالوة النووع الالوي لكيوان الاسوتثناء‪ .‬لحود الان‬ ‫‪ C++‬ليس له اي تسهيلات لفح (من نوع وقت التشغيل) قبل ان يكون معالج‬ ‫الاستثناء قد ت تطويرة‪ .‬ه ه التسهيلات ت خلقها من العودم لهو ا الغورض‪ .‬كتعقيود‬ ‫اضافي‪ ،‬التنفي يجب ان يستدعي دالة الهدم لكول الكيانوات المحليوة التوي كانوت قود‬ ‫بنيت او انشأت على الطريك من كتلة ‪ try‬الى تعبير ‪ throw‬قبول ان يوت تمريور‬ ‫المسيطر الى المعالج المناسب‪.‬‬ ‫هرذ العمليرة تردعى (‪ .)stack unwinding‬بسربب ان مترجمرات ‪ C++‬المبكررة‬ ‫تنقل ملف مصدر ‪ C++‬الرى ‪ C‬وعنردها فقرط يتررجم الشرفرة الرى شرفرة الماكنرة‪ ،‬منفرذ‬ ‫معالج الاستثناء عليه ان ينفذ تعريف نوع وقت التنفيذ وتر المكدس بلغة ‪ .C‬لحسرن‬ ‫الحظ جميع هذ العقبات تم ازلتها‪.‬‬ ‫‪ 11.11.1‬الاستثناءات اثناء بناء وهدم الكيانات‬ ‫‪Exceptions During Object's Construction and Destruction‬‬ ‫دوال البنراء والهردم تسرتدعى اليرا‪ .‬بالاضرافة لرذلك‪ ،‬لايمكنهرا اعرادة قريم للدلالرة‬ ‫علرى خطرأ وقرت التنفيرذ‪ .‬مرن الواضرح غالبيرة الطررق الموثوقرة لتقريرر اخطراء وقرت‬ ‫التنفيذ خلال دالرة بنراء وهردم الكيران تكرون بتنشريط اسرتثناء‪ .‬علرى كرل‪ ،‬هنرا وسرائط‬ ‫اضافية يجب ان تاخذها بنمر الاعتبار قبل ان تنشط استثناء في هذ الحالات‪ ،‬عليك‬ ‫ان تحذر عمليا حول تنشيط استثناء من دالة الهدم‪.‬‬ ‫‪ 22.22.1‬تفعيل استثناءات من دوال الهدم خطر‬ ‫‪Throwing Exceptions from a Destructor is Dangerous‬‬ ‫ان تنشيط استثناء من دالة الهدم غير محبرذ‪ ،‬ويعرود السربب الرى ان دالرة الهردم‬ ‫مرن الممكرن ان تسرتدعى بسربب اسرتثناء اخرر كجرزء مرن تفريرغ المكردس‪ .‬فراذا مرا ترم‬ ‫‪574‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫اسرتدعاء دالرة الهردم بسربب اسرتثناء اخرر ايضرا ينشرط اسرتثناء خراص بره‪ ،‬فران اليرة‬ ‫معالجة الاستثناءات ستستدعي دالة الانتهاء ()(‪ .)terminate‬فاذا كنت حقيقة تريد ان‬ ‫تنشط استثناء من دالة الهدم فانه مرن المحبرذ ان يرتم اولا الفحرص فيمرا اذا كران هنرا‬ ‫استثناء اخر لم يتم مسكة يتم معالجتة حاليا‪.‬‬ ‫‪ 22.21‬التمييز بين اس النوع والصنف‬ ‫‪Distinction between Typename and Class‬‬ ‫في قائمة وسائط قوالب الدوال‪ ،‬الكلمرة المفتاحيرة )‪ (typename‬والصرنف لهمرا‬ ‫نفب المعنى وبالامكران اسرتخدامهما بالتبرادل‪ .‬كرلا الكلمتران المفتاحيتران بالامكران ان‬ ‫تستخدم في نفب قائمة وسائط القالب‪.‬‬ ‫لاتمييز بين اسم النوع والصنف في قائمة وسائط القالب‬ ‫;)&‪template <typename T ،class U> calc (const T& ،const U‬‬ ‫ربما يكون اكثر تشجيعا لاستخدام الكلمة المفتاحية ‪ typename‬بدلا من الكلمرة‬ ‫المفتاحية ‪ class‬لتصميم نوع وسائط القالرب‪ ،‬بعرد كرل ذلرك فانرك بامكانرك ان تسرتخدم‬ ‫انرواع مبنيرة داخليرا (انرواع ليسرت صرنوف) كوسرائط نروع حقيقري‪ .‬اكثرر مرن ذلرك‪،‬‬ ‫)‪ (typename‬يبين بشكل اكثر وضوا بان الاسم الذي يتبعة هو نوع اسم‪ .‬علرى كرل‪،‬‬ ‫الكلمرة المفتاحيرة )‪ (typename‬اضريفت الرى ‪ ،C++‬لرذلك البررامج القديمرة تميرل اكثرر‬ ‫الى استخدام الكلمة المفتاحية ‪ class‬حصريا‪.‬‬ ‫اذا ماكررران هنرررا اي شرررك فيمرررا اذا كررران اسرررتخدام (‪ )typename‬ضرررروري‬ ‫لتخصيص اسم بان يكون نوع‪ ،‬فانها فكرر جيردة لتخصيصرة‪ .‬لريب هنرا ضررر فري‬ ‫تخصيص ‪ typename‬قبل النوع‪ ،‬فاذا ما كان ‪ typename‬ضروري‪ ،‬فانه لايؤثر‪.‬‬ ‫‪575‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫‪ 22.23‬اخطاء وقت الترجمة اثناء وقت الربط‬ ‫‪Compile-Time Errors at Link-Time‬‬ ‫بشركل عرام‪ ،‬عنرد ترجمرة القالرب‪ ،‬هنرا ثرلاث مراحرل مرن الممكرن خلالهرا ان‬ ‫يصدر المترجم خطأ‪ ،‬الاولى عندما يتم ترجمة تعريف القالرب نفسرة‪ .‬المتررجم بشركل‬ ‫عرام لايمكنرة ايجراد عردة اخطراء فري هرذ المرحلرة‪ .‬الاخطراء القواعديرة‪ ،‬مثرل نسريان‬ ‫الفارزة المنقوطة او كتابة اسم متغير باحرف مختلفة‪ ،‬هذ يمكن اكتشافها‪.‬‬ ‫الوقت الثاني لاكتشاف الخطا هو عندما يفحص المترجم استخدام القالب‪ ..‬فري‬ ‫هذ المرحلة لايزال هنا الكثير مما يمكرن للمتررجم ان يفحصرة‪ .‬عنرد اسرتدعاء دالرة‬ ‫قالرب فران العديرد مرن المترجمرات تفحرص فقرط فيمرا اذا كران عردد ونروع الوسرائط‬ ‫مناسب‪ .‬المترجم بامكانة ان يكتشرف ان هنرا عردد كبيرر او قليرل جردا مرن الوسرائط‪,‬‬ ‫وبامكانة ايضا ان يكتشف فيمرا اذا اثنران مرن الوسرائط مرن المفررو ان يكرون لهمرا‬ ‫نفب النوع هل هما متطابقان‪ .‬بالنسبة لقالب الصنف فان المترجم بامكانه ان يفحرص‬ ‫بان العدد الصحيح من وسائط القالب تم توفيرها وليب اكثر من ذلك‪.‬‬ ‫الوقت الثال عندما تتولد الاخطاء خلال الاحداث‪ .‬عندها فقط من الممكن ان‬ ‫نجد اخطاء لها علاقة بالنوع‪ .‬اعتمادا على كيفية ادارة المترجم للاحداث ‪.‬‬ ‫مرن المهرم ان ترردر عنردما يترررجم تعريرف القالرب‪ ،‬فسرروف لاتكرون معرفررة‬ ‫واضحة حول مقبوليرة البرنرامج‪ .‬نفرب الشريء ربمرا تمهرر اخطراء ترجمرة حترى بعرد‬ ‫الترجمة الناجحة مع كل ملف يستخدم القالرب‪ .‬لريب غيرر طبيعري ان تكتشرف اخطراء‬ ‫فقط خلال الاحداث‪ ،‬والتي ربما تحدث خلال وقت الربط‪.‬‬ ‫‪ 22.24‬أعلان الصداقة في قوالب الصنف‬ ‫‪Friend Declaration in Class Templates‬‬ ‫هنا ثلاث انواع من اعلانات الاصدقاء والتي ربما تمهر في قالب الصرنف‪.‬‬ ‫‪576‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫كل نوع من الاعلان يعلن عن صداقة مع كيان او اكثر‪:‬‬ ‫‪ .1‬اعلان الصداقة الاعتيادي لصنف او دالرة لريب قالرب‪ ،‬والرذي يمرنح علاقرة‬ ‫صداقة لاسم معين صنف او دالة‪.‬‬ ‫‪ .2‬اعلان صداقة لقالب صنف او قالب دالة والرذي يمرنح وصرول لكرل حرالات‬ ‫الصديق‪.‬‬ ‫‪ .3‬اعلان صديق والذي يمنح وصول الى حالات معينرة فقرط لقالرب صرنف او‬ ‫دالة‪.‬‬ ‫‪ 22.24.2‬الصداقات الاعتيادية ‪Ordinary Friends‬‬ ‫الصنف الذي هو ليب بقالب من الممكن ان يكون صديق لصنف قالب‪:‬‬ ‫{ ‪template <class Type> class Bar‬‬ ‫منح الوصول للصنف الاعتيادي‪ ،‬ليب قالب صنف اودالة ‪//‬‬ ‫;‪friend class FooBar‬‬ ‫;)(‪friend void fnc‬‬ ‫‪...‬‬ ‫;}‬ ‫هذا الاعلان يقول بان اعضراء الصرنف ‪ FooBar‬والدالرة ‪ fnc‬ربمرا تصرل الرى‬ ‫الاعضاء الخاصة والمحمية لاي حالة للصنف ‪( Bar‬لانهم اصدقاء)‪.‬‬ ‫‪ 22.24.1‬وداقة القوالب العامة ‪General Template Friendship‬‬ ‫الصديق من الممكن ان يكون قالب صنف اودالة‪.‬‬ ‫{ ‪template <class Type> class Bar‬‬ ‫;‪template <class T> friend class Foo1‬‬ ‫;)&‪template <class T> friend void templ_fcn1(const T‬‬ ‫‪...‬‬ ‫;}‬ ‫‪577‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫اعلانررات الصررداقة هررذ تسررتخدم وسررائط نرروع مختلفررة عررن الترري يسررتخدمها‬ ‫الصنف نفسة‪ .‬وسائط النوع هذ تشير الى وسائط نوع ‪ .temp_fcn1 ،Foo1‬في كلترا‬ ‫هراتين الحرالتين فران عردد غيرر محردد مرن الصرنوف والردوال تعمرل صرداقة مرع ‪.Bar‬‬ ‫اعلان الصداقة مع ‪ Foo1‬تفيد ان اي من حالات ‪ Foo1‬ربما تصل العناصر الخاصة‬ ‫لاي حالة من ‪.Bar‬‬ ‫اعرلان الصرداقة هرذا ينشريء علاقرة واحرد الرى عردد برين كرل حالرة مرن ‪Bar‬‬ ‫واصردقائها‪ .Foo1, and temp_fcn1 ،‬لكرل حالرة مرن ‪ Bar‬فران كرل حرالات‪،Foo1‬‬ ‫‪ temp_fcn1‬سيكونوا اصدقاء‪.‬‬ ‫‪ 22.24.3‬علاقة وداقة القوالب الخاوة ‪Specific Template Friendship‬‬ ‫بدل من جعل كل حالات قالرب الصرداقة صرنف مرن الممكرن ان يمرنح وصرول‬ ‫الى حالات محددة‪:‬‬ ‫;‪template <class T> class Foo2‬‬ ‫;)&‪template <class T> void templ_fcn2(const T‬‬ ‫{ ‪template <class Type> class Bar‬‬ ‫تمنح الوصول لحالة مفردة خاصة محددة بواسطة *‪// char‬‬ ‫;>*‪friend class Foo2<char‬‬ ‫;)& ‪friend void templ_fcn2<char*>(char* const‬‬ ‫‪// ...‬‬ ‫;}‬ ‫حتى وان كان )‪ (Foo2‬هو نفسه قالب صنف‪ ،‬فان علاقة الصداقة سرتمدد فقرط‬ ‫لحرالات خاصرة مرن ‪ Foo2‬والتري تعلرم بواسرطة *‪ . char‬نفرب الشريء‪ ،‬فران اعرلان‬ ‫الصداقة للدالة ‪ templ_fcn2‬تقول ان حالات هذ الدالرة فقرط المعلمرة بواسرطة *‪char‬‬ ‫‪578‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫هي صديق للصنف ‪ .Bar‬الحالات الخاصرة لكرل مرن ‪ templ_fcn2 ،Foo2‬والمعلمرة‬ ‫بواسطة *‪ char‬بامكانها ان تصل الى كل حالة من ‪.Bar‬‬ ‫اكثر عمومية اعلانات الصداقة للاشكال التالية‪:‬‬ ‫;‪template <class T> class Foo3‬‬ ‫;)&‪template <class T> void templ_fcn3(const T‬‬ ‫{ ‪template <class Type> class Bar‬‬ ‫كل حالة من ‪ Bar‬تمنح الوصول الى نسخة ‪//‬‬ ‫للحالات من نفب النوع ‪ templ_fcn3 //‬او ‪Foo3‬‬ ‫;>‪friend class Foo3<Type‬‬ ‫;)&‪friend void templ_fcn3<Type>(const Type‬‬ ‫‪// ...‬‬ ‫;}‬ ‫هرذ الصرداقات تعررف علاقرة صرداقة برين حرالات محرددة مرن ‪ Bar‬وحرالات‬ ‫من ‪ Foo3‬او‪ templ_fcn3‬والتي تستخدم نفب عوامل القالب‪ .‬كل حالة مرن ‪ Bar‬لهرا‬ ‫صديق مفرد مشتر من ‪.Foo3, and templ_fcn3 friend‬‬ ‫فقرط هرذ النسر مرن ‪ Foo3‬او ‪ templ_fcn3‬والتري لهرا نفرب عوامرل القالرب‬ ‫كحرالات معطراة مرن ‪ Bar‬هرم اصردقاء‪ .‬لرذلك فران >‪ Foo3<int‬ربمرا تصرل الاجرزاء‬ ‫الخاصة من >‪ Bar<int‬ولكن ليب من >‪ Bar<string‬او اي حالة اخرى من ‪.Bar‬‬ ‫‪ 22.24.4‬اعتماديات الاعلان ‪Declaration Dependencies‬‬ ‫عنردما تمررنح حرق الوصررول لكررل الحرالات لقالررب معررين‪ ،‬فانرك لاتحترراج الررى‬ ‫الاعرلان عرن ذلرك علرى انره قالرب الصرنف او الدالرة ضرمن مردا ‪ .‬جوهريرا‪ ،‬المتررجم‬ ‫سيعامل اعلان الصداقة كاعلان عن صنف او دالة‪.‬‬ ‫‪579‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫عندما تريد ان تحدد علاقة الصداقة لحالة معينة‪ ،‬عليره فران الدالرة او الصرنف‬ ‫يجب ان يعلن عنهم قبل ان يكون بالامكان استخدامهم في اعلان الصداقة‪:‬‬ ‫;‪template <class T> class A‬‬ ‫{ ‪template <class T> class B‬‬ ‫‪public:‬‬ ‫‪friend class A<T>; //‬‬ ‫واضح ان ‪ A‬قالب صنف‬ ‫هنا ان ‪ C‬اعتيادي ليست قالب صنف ‪friend class C; //‬‬ ‫‪template <class S> friend class D; //‬‬ ‫الان ‪ D‬هو قالب‬ ‫;>‪friend class E<T‬‬ ‫خطأ ‪ E‬لم يعرف كقالب ‪//‬‬ ‫;>‪friend class F<int‬‬ ‫خطأ ‪ F‬لم يعرف كقالب ‪//‬‬ ‫;}‬ ‫اذا لررم يررتم اخبررار المترررجم بشرركل مسرربق ان الصررداقة هرري قالررب‪ ،‬عليرره فرران‬ ‫المترجم سيعتقد بان الصديق هو صنف او دالة اعتيادية ليست قالب‪.‬‬ ‫سؤال للحل‪//:‬‬ ‫اكتب برنامج لتنفيذ قالب ‪ Template‬لتوليد اصناف الطابور ‪.Queue‬‬ ‫‪581‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫الفصل الثاني عشر‬ ‫عمليات الملف‬ ‫‪FILE OPERATIONS‬‬ ‫‪ 21.2‬المقدمة‬ ‫من بداية هذا الكتاب‪ ،‬فانرك تخرزن برامجرك علرى القررص الصرلب لحاسروبك‪،‬‬ ‫لذا فانك لاتحتاج الى اعادة طباعتة في كل وقت تحتاج له‪ .‬بشكل عرام‪ ،‬اي مجموعرة‬ ‫من المعلومات يتم خزنها والتي يمكن اعادة اسرتخدامها لاحقرا تردعى ملفرا )‪ .(file‬فري‬ ‫هذا الفصل ستتعلم كيفية خزن البيانات في الملف برمجيا‪ ،‬بحي ستكون قرادرا علرى‬ ‫قراءتها لاحقا او نقلها الى حاسوب اخر‪.‬‬ ‫سوف تقوم بالعمل على الملف بنفب الطريقة التي كنت تعمرل بهرا مرع الشاشرة‬ ‫ولوحة المفاتيح‪ .‬طبعا‪ ،‬وحي انك تملك تجربة مسبقة للعمل مرع الملفرات‪ ،‬فانرك تعلرم‬ ‫ان هنا فرقا بسيطا بين العمل على الملفات والعمل مع الشاشة ولوحة المفاتيح‪.‬‬ ‫‪ 21.1‬الملف‬ ‫الملررف هررو عبررارة عررن تجميررع للبيانررات او مجموعررة مررن الاحرررف او ربمررا‬ ‫برنامج او نص كتابي‪.‬‬ ‫والملف يعرف باسمة على القررص‪ ،‬وبامكانرك كتابرة المعلومرات (اخرراج مرن‬ ‫الحاسوب) او قراءة المعلومات (ادخال الى الحاسوب) مستخدما نفب الملف‪.‬‬ ‫عند التعامل مع الملفات‪ ،‬فربما سوف لا يكون هنا ملف واحد للتعامل معره‪،‬‬ ‫حي من الممكن ان يكون هنا عددا من الملفات ترغب ان تتعامرل معهرا‪ ،‬بردلا مرن‬ ‫ملرف واحرد فقرط للادخرال وملرف واحرد للاخرراج‪ .‬لرذلك‪ ،‬يجرب عليرك الاعرلان عرن‬ ‫ملفاتك ككيانات من الصنف )‪ (fstream‬واعطائها اسماء‪.‬‬ ‫وهنا نوعان من الملفات في ‪ C++‬هما‬ ‫‪Sequential File‬‬ ‫‪ .1‬الملف التسلسلي‬ ‫‪581‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫‪ .2‬ملف الوصول العشوائي ‪Random File‬‬ ‫أن خلق الملف التسلسلي اسهل من الملف العشوائي‪ ،‬ففي الملف التسلسلي فان‬ ‫البيانات او النصوص سوف تخزن ويعاد استرجاعها بشكل متسلسل‪.‬‬ ‫اما في الملف العشوائي فان البيانات يتم الوصول اليها ومعالجتها عشوائيا‪.‬‬ ‫البرنامج الذي تكتبة والذي يقوم بعملية الادخال والاخراج بالنسربة الرى الملرف‬ ‫الخررارجي يجررب ان يحترروي علررى الملررف الرئسرري )‪ (fstream‬وذلررك لان تعرراريف‬ ‫الصنف في هذا الملف تكون مشتقة مرن الصرنف (‪ ،)iostream‬كرذلك فران )‪(fstream‬‬ ‫تحتوي ضمنا (‪ (iostream‬أي تحتوي اوامر الأدخال والأخراج للملف‪.‬‬ ‫‪ 21.3‬معالجة الملفات ‪Manipulating Files‬‬ ‫بالامكان ان تعالج نوعين من الملفات‬ ‫‪ .1‬الملفات النصية ‪Text Files‬‬ ‫‪ .2‬الملفات الثنائية ‪Binary Files‬‬ ‫الملفات النصية منممة على شكل اسطر‪ ،‬وكرل سرطر يحردد مرع نهايرة السرطر‬ ‫)‪ .(endl‬البيانات تبقى على شكل مقروء‪ ،‬وتفصرل الفراغرات برين كرل بيانرات الملرف‪،‬‬ ‫لذلك سيكون من السهل فهم محتويات الملف‪.‬‬ ‫مرن جانرب اخرر‪ ،‬الملرف الثنرائي لايرنمم علرى شركل اسرطر‪ ،‬تكترب المعلومرات‬ ‫كأجزاء واحدة بعد الأخرى‪ ،‬والقيم الرقمية تخزن بالطريقة التي تعمل بها (أو تخزن‬ ‫بها) علرى ذاكررة الحاسروب‪ -‬بالصريغة الثنائيرة‪ .‬هرذ الارقرام لاتحرول الرى متتاليرة مرن‬ ‫الارقام العشرية‪ ،‬لكي يكون من السهولة قراءتها‪ .‬كنتيجة‪ ،‬طباعة الملف الثنائي ليب‬ ‫من السهولة فهمة‪.‬‬ ‫‪ 21.4‬الاعلان عن الملف ‪File Declaration‬‬ ‫وحير ان الملفرات هري كيانرات مرن الصرنف (‪ ،)fstream‬لرذا فران الاعررلان‬ ‫سيكون بسيطا جدا ومشابهة ل علان عن كيان من صنف محدد‪:‬‬ ‫‪582‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; ‪fstream identifier‬‬ ‫المعرف (‪ )identifier‬هرو ببسراطة اسرم سروف تسرتخدمة للاشرارة الرى الملرف‪-‬‬ ‫هرو لريب الاسرم الرذي يخرزن علرى القررص!‪ ..‬المقابلرة (او الرربط) برين هرذا المعررف‬ ‫واسم الملرف علرى القررص سروف يترر الرى الدالرة العضرو ()(‪( )open‬سرنأتي عليهرا‬ ‫لاحقا)‪.‬‬ ‫بعد ان يتم الاعلان عرن الملرف‪ ،‬بامكانرك اسرتخدام عردد مرن الردوال الأعضراء‬ ‫لانجاز العمليات عليه‪ ،‬اكثر الدوال الاعضاء أهمية هي‪:‬‬ ‫)‪(•open‬‬ ‫(‪(•close‬‬ ‫)‪(•eof‬‬ ‫‪ 21.4.2‬الدالة العضو )‪)open‬‬ ‫الأعرلان عرن الدالرة العضرو )‪ (open‬للصرنف (‪ )fstream‬يكرون وفرق الصريغة‬ ‫القواعدية‪:‬‬ ‫;)‪open(char filename[] ، int access_mode‬‬ ‫هرذ الدالرة تنشرأ التقابرل (او الرربط) برين كيران الملرف المسرتخدم فري برنامجرك‬ ‫والبيانات على القرص‪ ،‬كذلك تحدد كيف سيتم استخدام الملرف‪ :‬للادخرال‪ ،‬للاخرراج‪،‬‬ ‫للاضررافة‪.. ،‬الرر ‪ .‬وهررذ الدالررة تسررتخدم معرراملين‪ ،‬السلسررلة الرمزيررة (اسررم الملررف)‬ ‫)‪( (filename‬وهي عبارة عن مصفوفة مرن الأحررف) والتري تحردد اسرم الملرف علرى‬ ‫القررص‪ ،‬والمعامرل الثراني هرو مايشرير الرى طرور الوصرول )‪ (access-mode‬والرذي‬ ‫يبرين طرور الوصرول (الغرر مرن الوصرول الرى الملرف ‪ -‬اي هرل ل دخرال مرثلا أو‬ ‫الأخراج‪..‬ال )‪.‬‬ ‫اسرم الملرف هرو سلسرلة رمزيرة تنتهري برمرز النهايرة (‪ .)null‬مرن الممكرن ان‬ ‫تحتوي على الطريق الكامل الذي يؤدي الى الملرف (مكران خرزن الملرف)‪ ،‬ويتضرمن‬ ‫ذلك السواقة )‪ ،(driver‬الموجة ‪ directory‬ال ‪.‬‬ ‫‪583‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫طور الوصول سيكون واحدا من الاطوار التالية‪:‬‬ ‫جدول (‪ :)12.1‬يوضح اطوار الوصول للملفات‬ ‫وظيفتــــــــــــــــــة‬ ‫الطور‬ ‫فتح ملف للاخراج (كتابة)‬ ‫‪ios::out‬‬ ‫فتح ملف للادخال (قراءة)‬ ‫‪ios::in‬‬ ‫فتح ملف للربط (الكتابة ابتداءا من نهاية الملف)‬ ‫‪ios::app‬‬ ‫فتح الملف فقط اذا كان موجودا (أي عدم خلق ملف‬ ‫‪ios::nocreat‬‬ ‫جديد)‬ ‫فتح الملف ليكون المؤشر في نهاية الملف بدلا من‬ ‫‪ios::ate‬‬ ‫بدايتة‬ ‫حذف ملف أن وجد واعادة خلقة‬ ‫‪ios::trunk‬‬ ‫فتح ملف في حالة وجود الملف‬ ‫‪ios::replace‬‬ ‫فتح ملف للطور الثنائي وافتراضا يكون نصا‬ ‫‪ios::binary‬‬ ‫مثال‪//:‬‬ ‫الملرررف ‪ test.txt‬يفرررتح لعمليرررة الادخرررال وهرررو موجرررود علرررى السرررواقة (‪)D‬‬ ‫ضررمن محتويررات المجلررد (‪ )NewFolder‬سرريتم كتابررة الأمررر الخرراص بهررذ العمليررة‬ ‫بالطريقة التالية‪:‬‬ ‫;)‪Myfile.open (“D:\\\\ NewFolder\\test.txt” ، ios::in‬‬ ‫لاحظ هنا ان اسم الملف الذي يستخدم داخل البرنامج للاشرارة الرى الملرف هرو‬ ‫)‪ (Myfile‬وهرو اسرم يرتم اسرنادة الرى الملرف عنرد الأعرلان عرن الملرف (هرذا الأسررم‬ ‫يستخدم فقط داخل البرنامج‪ ،‬بمعنى لايمثل الأسم الذي يخزن به الملف على القرص‬ ‫الصلب حير سريخزن علرى القررص باسرم (‪ .)test.txt‬كرذلك لاحرظ كيفيرة كتابرة اسرم‬ ‫الملرف الحقيقري الرذي يخرزن علرى القررص ويحردد برين حاصررتين مرزدوجتين لان‬ ‫‪584‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫التعامل معه على انه سلسلة رمزية (دائما اسرم الملرف هرو سلسرلة رمزيرة ولرذلك يرتم‬ ‫التعامل معه على هذا الاساس)‪ ،‬بعدها يأتي طور الوصول (بعرد الفرارزة)‪ ،‬هنرا وفري‬ ‫هذا المثال طور الوصول محدد لعملية الأدخال )‪.(ios::in‬‬ ‫ملاحظة‪//:‬‬ ‫لاحرظ فري حالرة اسرتخدام الصرنف )‪ (ifstream‬فران الطرور الأفتراضري هرو‬ ‫الادخررال )‪ ،(ios::in‬كررذلك فرري حالررة اسررتخدام الصررنف ‪ ofstream‬فرران الطررور‬ ‫الأفتراضي هو الأخراج (لذا فأنرك فري هراتين الحرالتين لاتحتراج الرى تحديرد طرور‬ ‫الوصول‪ ،‬اما فري حالرة الصرنف )‪ (fstream‬والرذي هرو يعمرل ل دخرال والأخرراج‬ ‫فانه لايوجد طور أفتراضي ولذلك يجب أن يحدد الطور‪ ..‬لأنها تستخدم ل عرلان‬ ‫عن أكثر من طور‪.‬‬ ‫ملاحظة‪//:‬‬ ‫الأصناف التالية تستخدم لعمليات الأدخال والأخراج للملفات‪:‬‬ ‫‪ .1‬الملرررف الررررئيب )‪ (ifstream‬وهرررو صرررنف مشرررتق مرررن الصرررنف الاسررراس‬ ‫)‪ (istream‬ويستخدم لقراءة حزمة من الكيانات من الملف‪ .‬ولتوضريح عمرل‬ ‫هذا الصنف‪ ،‬لاحظ مقطرع البرنرامج الترالي الرذي يبرين كيفيرة فرتح ملرف لقرراءة‬ ‫حزمة من الكيانات من ملف محدد‬ ‫> ‪#include < fstream‬‬ ‫{ )( ‪void main‬‬ ‫; ‪ifstream infile‬‬ ‫; ) \" ‪infile.open ( \" data-file‬‬ ‫}‪………….‬‬ ‫‪ .2‬الملرررف الررررئيب )‪ (ofstream‬مشرررتق مرررن الملرررف الاسررراس )‪(ostream‬‬ ‫ويستخدم لكتابة حزمة من الكيانات في الملف‪.‬‬ ‫‪585‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫مثال‪ :‬مقطع البرنامج التالي يوضح كيفية فتح ملف لاغررا كتابرة حزمرة‬ ‫من الكيانات في ملف معين‬ ‫> ‪#include < fstream‬‬ ‫{ )( ‪void main‬‬ ‫; ‪ofstream infile‬‬ ‫; ) \" ‪infile.open ( \" data-file‬‬ ‫} …………‬ ‫‪ .3‬الملرررررف الررررررئيب)‪ (fstream‬و صرررررنف مشرررررتق مرررررن الصرررررنف الاسررررراس‬ ‫)‪ (iostream‬ويسررتخدم لكررل مررن قررراءة وكتابررة حزمررة مررن الكيانررات علررى‬ ‫الملف‪.‬‬ ‫ان الموجرة الررئيب ) > ‪ ( #include <fstream‬يحتروي اليرا علرى الملرف‬ ‫الرئيب )‪.( iostream‬‬ ‫مثرال ‪ :‬مقطرع البرنرامج الترالي يوضرح كيفيرة فرتح ملرف لكرل مرن القرراءة‬ ‫والكتابة لحزمة كيانات من‪/‬او في ملف معين‬ ‫> ‪#Include < fstream‬‬ ‫{ )(‪void main‬‬ ‫; ‪fstream infile‬‬ ‫; ) ‪infile.open ( \" data-file \" ، ios :: in || ios :: out‬‬ ‫} …………‬ ‫عند فتح الملف لكل من عمليرة القرراءة والكتابرة فران )‪ (i/o streams‬تحرافظ‬ ‫على مؤشرين احدهما ل دخال والثاني ل خراج ‪.‬‬ ‫‪ 21.4.2.2‬قراءة وكتابة رمز من ‪ /‬او في ملف‬ ‫‪586‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫الدوال الاعضاء التالية تستخدم لقراءة وكتابة رمز من او في ملف معين‬ ‫• ) ( ‪:get‬‬ ‫هذ الدالة تستخدم لقراءة رمز ابجدي من ملف معين ‪ ..‬مثال‬ ‫> ‪#include < fstream‬‬ ‫{ ) ( ‪void main‬‬ ‫; ‪ifstream infile‬‬ ‫; ‪char ch‬‬ ‫; )\" ‪infile.open (\" text‬‬ ‫{ )) (‪while (!infile.eof‬‬ ‫; ) (‪ch = infile.get‬‬ ‫} } …………‬ ‫لاحظ في هذا المثال انك لم تستخدم طور الوصول مع الأمر )‪ (open‬والسربب‬ ‫ان الملف اعلن عنه من نوع ‪ ifstream‬وبالترالي فران مثرل هرذا الصرنف يكرون الطرور‬ ‫الأفتراضري لره هرو القرراءة (‪ .)ios::in‬كرذلك فران الرمرز الرذي يرتم قراءترة سيوضرع‬ ‫بالمتغير الحرفي ‪ ch‬وبالتالي يمكن ان تجري عليه اي عملية نشاء‪.‬‬ ‫• )( ‪:put‬‬ ‫هذ الدالرة تسرتخدم لكتابرة رمرز فري ملرف معرين او حزمرة مخرجرات معينرة ‪..‬‬ ‫مثال‬ ‫> ‪#include < fstream‬‬ ‫{ )( ‪void main‬‬ ‫; ‪ofstream outfile‬‬ ‫; ‪char ch‬‬ ‫; )\" ‪outfile.open (\" text‬‬ ‫‪587‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫;”‪cout<<”Enter one character\\n‬‬ ‫;‪cin>>ch‬‬ ‫)‪outfile.put (ch‬‬ ‫} }‪………………….‬‬ ‫نفرب فكررة المثرال السرابق فران الدالرة ‪ open‬لرم تسرتخدم طرور الوصرول حير‬ ‫سيكون طور الوصول الافتراضي هنا هرو الأخرراج او الكتابرة ‪ ios::out‬وذلرك لانرك‬ ‫اعلنت عن الملف مع الصنف )‪ ،(ofstream‬كذلك لاحظ انه بعد ان تمت قرراءة رمرز‬ ‫حرفي من اي عملية أدخال (ممكن ان تكرون باسرتخدام لوحرة المفراتيح)‪ ،‬فانره يمكنرك‬ ‫اضافتة الى الملف باستخدام الدالة (‪.)put‬‬ ‫‪ 21.4.1‬الدالة العضو )‪)close‬‬ ‫الدالة العضو )‪ (close‬تستخدم ليتم التأكيد بان كل بياناتك كتبت على القرص‪.‬‬ ‫في عدد من الحالات فان البيانات لاتكتب حالا على القرص‪ ،‬فاذا لم يتم غلرق الملرف‬ ‫بشركل مناسررب‪ ،‬فرران قسررم مررن البيانررات سرروف تفقررد‪ .‬هررذ الدالررة العضررو لاتسررتخدم‬ ‫معاملات او وسائط‪.‬‬ ‫ان الدالرة العضرو ()(‪ )close‬تسرتخدم لغلرق ملرف سربق وان ترم فتحره لاجرراء‬ ‫عمليرات ملرف عليره مثرل القرراءة‪ ،‬الكتابرة‪ ،‬او قرراءة وكتابرة معرا‪ .‬وتسرتدعى الدالرة‬ ‫() ( ‪ )close‬أليا بواسطة دوال الهدم (‪ ،)destructor‬ومع ذلك فانه بالأمكران اسرتدعاء‬ ‫هذ الدوال الأعضاء لغلق الملف خارجيا‪.‬‬ ‫الصيغة القواعدية العامة للدالة ()(‪ )close‬هي‪:‬‬ ‫; ) (‪File-name. close‬‬ ‫مثال‪:‬‬ ‫> ‪#include < fstream‬‬ ‫{ )( ‪void main‬‬ ‫‪588‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; ‪fstream infile‬‬ ‫; )‪infile.open (\" data-file \" ،ios:: in || ios:: out‬‬ ‫‪………………….‬‬ ‫} ; )(‪infile.close‬‬ ‫مثال أخر‪:‬‬ ‫>‪#include <fstream‬‬ ‫)(‪void main‬‬ ‫{‬ ‫;‪fstream myfile‬‬ ‫;)‪myfile.open(“list.txt” ،ios::out‬‬ ‫; ”‪myfile <<”Anything goes.‬‬ ‫;)(‪myfile.close‬‬ ‫}‬ ‫هرذا البرنرامج يخلرق ملفرا باسرم )‪ (list.txt‬وكتبرت السلسرلة (‪)Anything goes‬‬ ‫فيرره‪ .‬لاحررظ لغررر اسررتخدام الملررف يجررب ان يحترروي البرنررامج الملررف الرأسرري‬ ‫(‪ )fstream‬لغر الكتابة بالملف تم اسرتخدام طريقرة مشرابهة لطريقرة اوامرر الكتابرة‬ ‫الاعتيادية )<<‪ (cout‬بابدال (‪ )cout‬باسم الملف‪ .‬بامكانك تنفيرذ هرذا البرنرامج وانمرر‬ ‫الى محتويات الملف (‪ )list.txt‬مسرتخدما اي معرالج كلمرات‪ ،‬بامكانرك ايضرا ان تطبرع‬ ‫محتويات الملف من اي معالج كلمات‪.‬‬ ‫م ح‪،‬ة‪//:‬‬ ‫عندما تقرأ أخرر جرزء مرن المعلومرات برالملف فانرك سروف لاتسربب بنهايرة‬ ‫الملف )) (‪ .(eof‬شرط نهاية الملف يتحفز فقرط عنردما تحراول القرراءة الرى مرا بعرد‬ ‫اخر جزء من المعلومات في الملف ‪.‬‬ ‫‪589‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫ملاحظة‪//:‬‬ ‫في حالة خلق ملف فأذا لم تحدد المكان الرذي سريكون الملرف موجرودا فيره‪،‬‬ ‫فان الملف سيخلق في الموقع الحالي )‪.(directory‬‬ ‫‪ 21.5‬دوال اعضاء لبدض حالا حزمة البيانا‬ ‫في لغة ‪ C++‬فان الدوال الخاصة بفتح الملف (‪ )ios‬تعيد المعلومات عرن حالرة‬ ‫الملف‪ ،‬مثل الوصول الى نهاية الملف‪ ،‬الفشل في فتح الملرف‪ ،‬وهكرذا‪ .‬الردوال التاليرة‬ ‫تستخدم لفحص حالة فتح الملف عندما ترغب فتح ملف من القرص وهي‪:‬‬ ‫)( ‪eof() ، fail () ،bad () ،good‬‬ ‫‪ 21.5.2‬الدالة العضو ( )( ‪)eof‬‬ ‫الدالة العضو))( ‪( )eof‬شرط نهاية الملف) مفيدة جدا عند القيام بعملية القرراءة‬ ‫من الملفات‪ .‬فهي تعيد القيمة (‪ )1‬اذا حاولت ان تقرأ مابعد اخر البيانرات فري الملرف‪،‬‬ ‫حير انرك فري اغلرب الحرالات لاتعررف مسربقا كرم جرزء مرن البيانرات موجرودا علرى‬ ‫الملف‪ .‬اذن ماهو الحل؟ الحل هو استمر بالقراءة لحين الوصول الى نهاية الملف‪.‬‬ ‫هذ الدالة تستخدم لفحص وصول المؤشر الى نهاية الملف‪ ..‬فاذا كان المؤشر‬ ‫قد وصل نهاية الملف فان هذ الدالة ستعيد قيمرة لا تسراوي صرفرا وفري خرلاف ذلرك‬ ‫تعيد قيمة تساوي صفرا (‪.)1‬‬ ‫‪(fail ( ) ) 21.5.1‬‬ ‫تستخدم هذ الدالة للفحص فيما اذا تم فتح الملرف لعمليرات الادخرال والاخرراج‬ ‫بشكل ناجح او حدوث خطأ بسبب مثلا عمليات غير مسموا بها تؤدي الى عدم فرتح‬ ‫الملف‪ ..‬في حالة الفشل فانها ستعيد قيمة لاتساوي صفرا‪ .‬مثال لاستخدام هذ الدالة‬ ‫> ‪#include < fstream‬‬ ‫{ )( ‪void main‬‬ ‫‪591‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; ‪ifstream infile‬‬ ‫; )\" ‪infile.open (\" text‬‬ ‫{ )) (‪while (!infile.fail‬‬ ‫; ‪cout << \" couldn't open a file \" << endl‬‬ ‫;)‪exit(1‬‬ ‫} } ‪………………..‬‬ ‫‪)Bad ( ) ) 21.5.3‬‬ ‫هذ الدالة تستخدم لفحرص أي محاولرة لعمليرات غيرر شررعية علرى الملرف او‬ ‫كان هنا خطا‪ ،‬الدالة ()(‪ )bad‬تعيد قيمة لاتساوي صفرا اذا كانت النتيجرة صرحيحة‬ ‫وبخلاف ذلك تعيد صفر مثال‬ ‫> ‪#include < fstream‬‬ ‫> ‪#include < stdlib‬‬ ‫{ )( ‪void main‬‬ ‫; ‪ifstream infile‬‬ ‫; )\" ‪infile.open (\" text‬‬ ‫{ )) (‪if (infile.bad‬‬ ‫; ‪cerr << \" open failare \" << endl‬‬ ‫} ; )‪exit (1‬‬ ‫} ‪……….‬‬ ‫‪)Good( ) ) 21.5.4‬‬ ‫تستخدم هذ الدالة للفحص فيما اذا كانت عملية الملف السابقة قرد تمرت بنجراا‬ ‫ام لا‪ .‬هذ الدالة تعيد قيمة لاتساوي صفرا اذا لم يكن هنا خطأ‪ .‬مثال‬ ‫‪591‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ #include < fstream > #include < stdlib > void main () { ifstream infile ; infile.open (\" text \") ; if (infile.good ( )) { ………… } } ‫ امثلة محلولة‬21.6 )text( ‫• برنامج لكتابة مجموعة من الاسطر في ملف معين اسمه‬ // Example 12.1 #include < fstream > void main () { ofstream outfile ; outfile.open ( \" text \" ) ; outfile << \" this is a test \\n \" ; outfile << \" program to store \\n \" ; outfile << \" a set of lines on to a file \\n \" ; outfile.close( ) ; } ‫• برنامج لكتابة مجموعة من الاسطر في ملف معورف مون المسوتخدم حيوث ان اسو‬ . ‫الملف محدد في ور تعريف المستخدم‬ // Example 12.2 #include < fstream > void main () { ofstream Outfile ; char fname [10] ; cout << \" enter a file name to be opened ? \\n \"; cin >> fname ; 592

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ outfile.open ( fname ) ; outfile << \" this is a test \\n \" ; outfile << \"program to store \\n \" ; outfile << \" a set of lines on to a file \\n \" ; outfile.close() ; } ‫• برنامج لقراءة مجموعة من الاسطر من لوحة المفاتي وخزنها في ملف محدد‬ // Example 12.3 #include < fstream > #define max 2000 void main () { ofstream outfile ; char fname [ 10 ] َ line [ max ] ; cout << \" enter a file name to be opened ? \\n \" ; cin >> fname ; outfile.open ( fname ) ; char ch ; int I ; cout << \" enter a set of lines and terminate with @ \\n \" ; cin.get ( line َ max َ' @ ' ) ; cout << \" given input \\n \" ; cout << line ; cout << \" storing onto a file …… \\n \" ; outfile << line ; outfile.close() ; } ‫• برنامج لقراءة ملف نصي وعرض محتوياتة على الشاشة‬ // Example 12.4 #include < fstream > #include < iostream > #include < iomanip > #include <stdlib > void main () { ifstream infile ; char fname [ 10 ] ; char ch ; cout << \" enter a file name ? \\n \" ; cin >> fname ; 593

‫ من البداية إلى البرمجة الكيانية‬C++ infile.open ( fname ) ; if ( infile.fail ( ) ) { cerr << \" No such a file exists \\n \" ; exit ( 1 ) ; } while ( ! infile.eof ( ) ) { ch = ( char ) infile.get ( ) ; cout.put ( ch ) ; } infile.close ( ) ; } ‫• برنامج لاستنساق محتويات ملف في ملف أخر‬ // Example 12.5 #include < fstream > #include < iostream > #include < iomanip > #include <stdlib > void main () { ofstream outfile ; ifstream infile ; char fname1 [ 10 ] َ fname2 [ 10 ] ; char ch ; cout << \" enter a file name to be copied ? \\n \" ; cin >> fname1 ; cout << \" enter new file name ? \\n ; cin >> fname2 ; infile.open ( fname1 ) ; if ( infile.fail () ) { cerr << \" No such a file exists \\n \" ; exit ( 1 ) ; } outfile.open ( fname2 ) ; if ( outfile.fail () ) { cerr << \" Unable to creat a file \\n \" ; exit ( 1 ) ; } while ( ! infile.eof () ) { ch = ( char ) infile.get () ; outfile.put ( ch ) ; } infile.close ; outfile.close() ; } ‫) مثل‬white space( ‫• برنامج لح ف الفراغات‬ (horizontal tab, line feed, new line, carrage return, space, vertical tab,( 594

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ .‫من ملف نصي وخزن محتويات الملف بدون الفراغات في ملف اخر‬ // Example 12.6 #include < fstream > #include < iostream > #include < iomanip > #include <stdlib > void main () { ofstream outfile ; ifstream infile ; char fname1 [ 10 ] َ fname2 [ 10 ] ; char ch ; cout<<”Enter a filename to be copied?\\n”; cin>>filename1; cout<<”New filename?\\n” ; cin >> fname2 ; infile.open ( fname1 ) ; if ( infile.fail() ) { cerr << \" No such a file exists \\n \" ; exit ( 1 ) ; } while ( ! infile.eof () ) { ch = ( char ) infile.get () ; if ( ch = = ' ' || ch = = ' \\t ' || ch = = ' \\n ' ) ; else outfile.put ( ch ) ; } infile.close () ; outfile.close () ; } ‫) فوي ملوف‬upper case( ‫• برنامج لتحويل الحروف الصغيرة الوى حوروف كبيورة‬ .‫نصي‬ // Example 12.7 #include < fstream > 595

‫ من البداية إلى البرمجة الكيانية‬C++ #include < iostream > #include < iomanip > #include <stdlib > #include < ctype > void main ( ) { ofstream outfile ; ifstream infile ; char fname1 [ 10 ] َfname2 [ 10 ] ; char ch َ uch ; cout << \" enter a file name to be copied ? \\n \" ; cin >> fname1 ; cout << \" new file name ? \\n \" ; cin >> fname2 ; infile.open ( fname1 ) ; if ( infile.fail () ) { cerr << \" No such a file exists \\n \" ; exit ( 1 ) ; } outfile.open ( fname2 ) ; if ( outfile.fail () ) { cerr << \" Unable to creat a file \\n \" ; exit ( 1 ) ' while ( ! infile.eof () ) { ch = ( char ) infile.get () ; uch = toupper ( ch ) ; outfile.put ( uch ) ; infile.close () ; outfile.close () ; } 596

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫‪ 21.7‬عمليات الملف الثنائي ‪Binary File Operations‬‬ ‫في لغة ‪ C++‬فان عمليات الملف بالافترا تنجز بطور النص‪ ،‬ولكنها تردعم‬ ‫عمليرات الملرف الثنرائي ايضرا‪ .‬والملرف الثنرائي هرو ملرف وصرول متسلسرل حير ان‬ ‫البيانات تخزن ويعراد قراءتهرا واحردة بعرد الاخررى بالصريغة الثنائيرة بردلا مرن رمروز‬ ‫)‪ ،(ASCII‬مثال‪:‬‬ ‫ملف ثنائي يحتوي على اعداد صحيحة‪ ،‬اعداد حقيقية‪ ،‬مصفوفة هياكل‪ ..‬الر ‪.‬‬ ‫معالجة الملف الثنائي مناسبة جدا لتصميم وتطوير البيانرات المعقرد او قرراءة وكتابرة‬ ‫المعلومات الثنائية‪.‬‬ ‫الملرف النصري الرذي يخلرق بواسرطة ‪ C++‬ممكرن ان يحردث (‪ )edit‬بواسرطة‬ ‫المحدثات الاعتيادية او معالج الكلمات (‪ ،)word processor‬كذلك فان الملف النصي‬ ‫ممكن ان ينقل بسهولة من نمام حاسوب الى اخر‪ ،‬من جانب اخر فان الملف الثنرائي‬ ‫هو اكثر دقة عند استخدام الاعداد لانه يخزن بالضبط التمثيل الرداخلي للقيمرة‪ ،‬حير‬ ‫لايوجد اخطاء تحويل او تدوير للاعرداد‪ ،‬كرذلك فران خرزن البيانرات بالصريغة الثنائيرة‬ ‫يكون اسرع اذا لم يكرن هنرا حاجرة للتحويرل عنرد خرزن البيانرات فري الملرف‪ .‬ملرف‬ ‫بيانات الصيغة الثنائية عادة ياخذ مساحة خزنية اقل ولكن الملاحظ ان ملف الصريغة‬ ‫الثنائيرة لايمكرن نقلرة بسرهولة مرن نمرام حاسروب الرى اخرر بسربب الاخرتلاف بالتمثيرل‬ ‫الداخلي للبيانات من نمام حاسوب الى اخر‪.‬‬ ‫ولغر فتح ملف ثنائي فاننا نحتاج الى الاشارة الى الطرور الثنرائي عنرد فرتح‬ ‫الملف ويمكن ذلك بتحديد الطور الثنائي في فتح الملف‪:‬‬ ‫; )‪infile (\" data \" ، ios:: binary‬‬ ‫مقطع البرنامج التالي يوضح كيفية فتح ملف ثنائي في لغة ‪C++‬‬ ‫> ‪#include < fstream‬‬ ‫{ )( ‪void main‬‬ ‫; ‪ofstream outfile‬‬ ‫‪597‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ outfile (\" data \" ،ios:: binary) ; ………………….. ‫• برنامج لفت ملف ثنائي لخزن مجموعة من الاعداد في ملف معين‬ // Example 12.8 #include < fstream > #include < iostream > #include < iomanip > void main () { ofstream outfile ; char fname [ 10 ] ; float x َ y َ temp ; cout << \" enter a file name ? \\n \" ; cin >> fname ; outfile.open ( fname َ ios :: out || ios :: binary ) ; x = 1.5 ; y = 10.5 ; cout << \" x temp \" << endl ; cout << \"-------------------------- \" << endl ; while ( x < = y ) { temp = x * x ; outfile >> x >> ' \\t ' << temp << endl ; cout << x << ' \\t ' >> temp >>endl ; x = x + 1.5 ; } outfile.close () ; } ‫• برنامج لفت ملف ثنائي لقراءة مجموعوة مون الاعوداد لغايوة ملاحظوة علاموة نهايوة‬ ‫الملف وعرض محتويات الملف على الشاشة‬ // Example 12.9 #include < fstream > #include < iostream > #include < iomanip > void main () { ifstream outfile ; char fname [ 10 ] ; float x َy َtemp ; cout << \" enter a file name ? \\n \" ; cin >> fname ; outfile.open ( fname َ ios :: in ||ios :: binary ); //‫قراءه من مَف‬ cout << \" x temp \" << endl ; 598

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; ‪cout << \" ------------------------------- \" << endl‬‬ ‫{ ) )(‪while ( !outfile.eof‬‬ ‫; ‪outfile >> x >> ' \\t ' >> temp‬‬ ‫} ; ‪cout << x << ' \\t ' << temp << endl‬‬ ‫; )( ‪outfile.close‬‬ ‫}‬ ‫‪ 21.8‬التراكيب وعمليات الملف ‪Structures and File Operations‬‬ ‫التركيب هو نروع بيانرات يعررف مرن المسرتخدم‪ ..‬عناصررة هري انرواع مختلفرة‬ ‫(غيررر متجانسررة)‪ ،‬حيرر ان مصررفوفة مررن الهياكررل ممكررن خزنهررا والوصررول اليهررا‬ ‫باسرتخدام اوامرر التعامرل مرع الملرف‪ ،‬واحيانرا ربمرا يتطلرب الامرر خرزن تجمرع مرن‬ ‫عناصر الهياكل واعادتها بذات الصيغة‪.‬‬ ‫• مقطووع البرنووامج التووالي يوضوو كيفيووة فووت ملووف للقووراءة والكتابووة لنوووع بيانووات‬ ‫تركيب‪..‬‬ ‫> ‪#include < iostream‬‬ ‫‪struct student‬‬ ‫; } ; ‪{ char name [ 20 ] ; int age‬‬ ‫{ )( ‪void main‬‬ ‫; ‪struct school‬‬ ‫; ] ‪fstream infile ; char fname [ 10‬‬ ‫; ) ‪infile.open ( fname َios :: in || ios :: out‬‬ ‫‪…………..‬‬ ‫زإ في المَف ‪//‬‬ ‫; ) ‪infile.open ( fname َios :: out‬‬ ‫; \" ‪cout << \" storing onto the file ….. \\n‬‬ ‫; ‪infile << student.name << setw (5) << student.age << endl‬‬ ‫‪………………….‬‬ ‫القراءه من المَف ‪//‬‬ ‫; ) ‪infile.open ( fname َios :: in‬‬ ‫; \" ‪cout << \" reading from the file ………….. \\n‬‬ ‫{ ) )( ‪while ( ! infile.eof‬‬ ‫; ‪infile >> student.name >> setw ( 5 ) >> student.age‬‬ ‫………………………‬ ‫;)( ‪} infile.close‬‬ ‫}‬ ‫‪599‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ ،‫ الطوول‬،‫ الجونس‬، ‫ العمور‬، ‫• برنوامج لقوراءة بيانوات لعناوور تركيوب مثول (الاسو‬ ‫ ثو نفوس الملوف يفوت للقوراءة‬،‫الوزن) من لوحة المفاتي وخزنها في ملوف محودد‬ .‫وعرض محتوياتة على الشاشة‬ // Example 12.10 #include < fstream > char sex ; float height ; float #include < iostream > #include < iomanip > #include <stdlib > #include < ctype > # define max 200 struct school { char name [ 20 ] ; int age ; weight ; } ; void main () { struct school student [ max ] ; fstream infile ; char name [ 10 ] ; int I َn ; cout << \" Enter a file name to be stored \\n \" ; cin >> fname ; infile.open ( fname َios :: in || ios :: out ) ; // ُّ‫القراءه من لوحة المفاتي‬ cout << \" How many records are to be stored \\n \" ; cin>> n ; for ( I = 0 ; I < = n-1 ; ++I ) { cout << \" name : \" ; cin >> student [ I ]. name ; cout << \" age : \" ; cin >> student [ I ]. age ; cout << \" sex : \" ; cin >> student [ I ]. sex ; cout << \" height : \" ; cin >> student [ I ]. height ; cout << \" weight : \" ; cin >> student [ I ]. weight ; } // ‫الطزإ في المَف‬ infile.open ( fname َ ios :: out ) ; cout << \" storing onto the file …. \\n \" ; for ( I =0 ; I < = n-1 ; ++I ) { infile << student [ I ] . name << setw ( 5 ) << student [ I ].age << setw [ 10 ] << student [ I ] .sex << setw ( 5 ) << 611

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; ‪student [ I ].height << setw ( 5 ) << student [ I ]. weight << endl‬‬ ‫; )( ‪infile.close‬‬ ‫; ) ‪infile.open ( fname َ ios :: in‬‬ ‫القراءه من المَف‪//‬‬ ‫; \" ‪cout << \" reading from the file …… \\n‬‬ ‫;‪I=0‬‬ ‫{ ) )(‪while ( ! infile.eof‬‬ ‫>> ‪infile >> student [ I ] . name >> setw ( 5 ) >> student [ I ] .age‬‬ ‫>> ) ‪setw [ 10 ] >> student [ I ] . sex >> setw ( 5‬‬ ‫; ‪student [ I ] .height >> setw ( 5 ) >> student [ I ] .weight‬‬ ‫} ; ‪I++‬‬ ‫{ ) ‪for ( int j = 0 ; j < = n-1 ; ++j‬‬ ‫<< ‪cout << student [ j ] . name << setw ( 5 ) << student [ j ].age‬‬ ‫<< ) ‪setw [ 10 ] << student [ j ] .sex << setw ( 5‬‬ ‫; ‪student [ j ] .height << setw ( 5 ) << student [ j ]. weight << endl‬‬ ‫}‬ ‫; ) ( ‪infile.close‬‬ ‫}‬ ‫‪ 21.9‬الصنف وعمليات الملف ‪Class and File Operations‬‬ ‫نمررا الرى ان لغرة ‪ C++‬هري لغرة برمجرة كيانيرة فمرن المعقرول دراسرة كيفيرة‬ ‫امكانيرة قرراءة وكتابرة الكيران (‪ )object‬فري الملرف‪ ،‬هنرا يجرب ان يحتروي البرنرامج‬ ‫الملرف الراسري (‪ )fstream‬لغرر التعامرل مرع عمليرات الادخرال والاخرراج للملرف‪،‬‬ ‫ويجب ان تعرف طور عمليات الملف (للقراءة ‪ ،‬للكتابة ‪ ،‬او القراءة والكتابة)‪.‬‬ ‫فري عمليرات الملرف الثنرائي التري تتطلرب عمليرات ادخرال واخرراج‪ ،‬فقرد ترم‬ ‫انجازهرا باسرتخدام الردوال الاعضراء ()( ‪ )get (), and put‬لحشرر واسرتخلاص‬ ‫العوامرل‪ ،‬بينمرا تسرتخدم الردوال الاعضراء ( )( ‪ )and write () ،read‬لقرراءة وكتابرة‬ ‫حزمرة مرن الكيانرات مرن ملرف محردد وبالتعاقرب‪ ،‬حير ان الدالرة العضرو ()( ‪)read‬‬ ‫تستخدم للحصول على بيانات لحزمرة مرن الكيانرات مرن ملرف محردد والقاعردة العامرة‬ ‫لها هي‪:‬‬ ‫; ))‪infile.read ( (char*) & obj ،sizeof (obj‬‬ ‫‪611‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ ‫• مقطع البرنامج التالي يبين كيفية قراءة ونف من الكيانات من ملف يستخدم الدالوة‬ )read( ‫العضو‬ #include < fstream > class student-info { protected : char name [ 20 ] ; int age ; char sex ; public : void getdata () ; } ; void main () { student-info obj ; fstream infile ; infile.open ( \" data \" َios :: in ) ; infile.read ( ( char* ) &obj َsizeof ( obj ) ) ; ………………… infile.close() ; } ‫ فهي تستخدم لكتابة كيان في ملف أي خرزن حزمرة‬write () ‫اما الدالة العضو‬ :‫) هي‬write( ‫من الكيانات في ملف محدد والصيغة العامة للدالة‬ infile.write (( char*) &obj ،sizeof (obj)) ; ‫• مقطع البرنامج التالي يوض كيفية استخدام دالة الكتابة‬ #include <fstream > class student-info { protected : char name [ 20 ] ; int age ; char sex ; public : void getdata () ; void display () ; } ; void main () { student-info obj ; fstream outfile ; 612

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ outfile.open ( \" data \" َios :: out ) ; outfile.write ( ( char* ) &obj َsizeof ( obj ) ) ; ………………. outfile.close() ; } ،‫ الجنس‬،‫ العمر‬، ‫) مثل (الاس‬student-info( ‫• برنامج لقراءة كيان من الصنف‬ ،read( ‫ الوووزن) موون لوحووة المفوواتي وخزنهووا بملووف محوودد باسووتخدام‬،‫الطووول‬ .‫ ث فت الملف ثانية للقراءة وعرض محتوياتة على الشاشة‬.)write // Example 12.11 #include < fstream > #include < iostream > #include < iomanip > class student-info { protected : char name [ 20 ] ; int age ; char sex ; float height ; float weight ; public : void getdata ( ) ; void display ( ) ; }; void student-info :: getdata ( ) { cout << \" Enter the following information \\n \" ; cout << \" name : \" ; cin >> name ; cout << \" age : \" ; cin >> age ; cout << \" sex : \" ; cin >> sex ; cout << \" height : \" ; cin >> height ; cout << \" weight : \" ; cin >> weight ; } void student-info :: display () { cout << name << setw ( 5 ) << age << setw ( 10 ) << sex << setw ( 5 )<< height << setw ( 5 ) << weight << endl ; } void main ( ) { 613

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫; ] ‪student-info obj ; fstream infile ; char fname [ 10‬‬ ‫; \" ‪cout << \" Enter a file name to be stored ? \\n‬‬ ‫; ‪cin >> fname‬‬ ‫; ) ‪infile.open ( fname َ ios :: in || ios :: out‬‬ ‫القراءه من لوحة المفاتيُّ‪//‬‬ ‫; )( ‪obj.getdata‬‬ ‫الطزإ في المَف‪//‬‬ ‫; ) ‪infile.open ( fname َ ios :: out‬‬ ‫; \" ‪cout << \" storing onto the file ……. \\n‬‬ ‫; ) ) ‪infile.write ( ( char* ) &obj َ sizeof ( obj‬‬ ‫; )( ‪infile.close‬‬ ‫القراءه من المَف‪//‬‬ ‫; ) ‪infile.open ( fname َios :: in‬‬ ‫; \" ‪cout << \" Reading from the file … \\n‬‬ ‫; ) ) ‪infile.read ( ( char* ) &obj َ sizeof ( obj‬‬ ‫; )( ‪obj.display‬‬ ‫; )( ‪Infile.close‬‬ ‫}‬ ‫‪ 21.21‬مصفوفة من كيانات ونف وعمليات الملف‬ ‫‪Arrays of Class Objects and File Operations‬‬ ‫في هذا المقطع ستتعرف علرى كيفيرة قرراءة وكتابرة كيانرات الصرنف مرن ملرف‬ ‫محدد‪ .‬من المعروف ان المصفوفة هري نروع بيانرات يعرفهرا المسرتخدم‪ ،‬لهرا عناصرر‬ ‫متجانسرة وتخرزن فري مواقرع ذاكررة متسلسرلة‪ .‬فري التطبيقرات العمليرة فران مصرفوفة‬ ‫كيانرات الصرنف هري جوهريرا لبنراء انممرة اساسرها بيانرات معقردة‪ ،‬وعليره يكرون مرن‬ ‫المفيد دراسة كيفية قراءة وكتابة مصفوفة من كيانات صنف في ملف‪.‬‬ ‫• برنامج يوضح عملية القراءة والكتابة لمصفوفة من الكيانات في ملف‬ ‫‪// Example 12.12‬‬ ‫> ‪#include < iostream‬‬ ‫; ‪int const max = 200‬‬ ‫‪614‬‬


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook