[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
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 1 - 50
- 51 - 100
- 101 - 150
- 151 - 200
- 201 - 250
- 251 - 300
- 301 - 350
- 351 - 400
- 401 - 450
- 451 - 500
- 501 - 550
- 551 - 600
- 601 - 632
Pages: