You are on page 1of 23

‫الجــــــــــزء الثــــــاني ‪ :‬مــــــكتبــــــة الــــــيس ‪++‬‬

‫‪Part II: The C++ Library‬‬

‫الـمحتويات‬
‫‪Contents‬‬

‫‪Chapter 8‬‬ ‫الفصل ‪8‬‬

‫‪The IO Library‬‬ ‫مكتبة املدخالت واملخرجات‬

‫‪Chapter 9‬‬ ‫الفصل ‪9‬‬

‫‪Sequential Containers‬‬ ‫الحاويات املتسلسلة‬

‫‪Chapter 10‬‬ ‫الفصل ‪10‬‬

‫‪Generic Algorithms‬‬ ‫الخوارزميات الشاملة‬

‫‪Chapter 11‬‬ ‫الفصل ‪11‬‬

‫‪Associative Containers‬‬ ‫الحاويات التجميعية‬

‫‪Chapter 12‬‬ ‫الفصل ‪12‬‬

‫‪Dynamic Memory‬‬ ‫الذاكرة الحيوية‬


‫في يس‪ ++‬ومع كل مراجعة للغة ‪ ،‬تنمو معها املكتبة أيضاً‪ .‬في الواقع ‪ ،‬تم تخصيص أكرث من ثليث نصوص املعيار‬
‫الجديد للمكتبة‪.‬‬
‫• بالرغم من أنه ليس باﻹمكان تغطية كل قسم في املكتبة بعمق‪،‬‬
‫تعرفها املكتبة ينبغي أن تكون في متناول استخدامات كل مربمج‪.‬‬
‫إﻻ أن هناك أقساماً أساسية ّ‬ ‫•‬
‫سنغطي تلك اﻷقسام اﻷساسية في هذا الجزء‪.‬‬ ‫•‬
‫سنبدأ بمكتبة املدخالت واملخرجات القياسية في الفصل الثامن‪.‬‬ ‫•‬
‫فإضافة إلى استخدام املكتبة لقراءة القنوات املرتبطة بنافذة وحدة التحكم وكتابتها ؛‬ ‫•‬
‫تعرف املكتبة أيضاً أنواعاً تتيح لنا قراءة وكتابة ملفات مسما ٍة ‪،‬‬
‫ّ‬ ‫•‬
‫وتنفيذ عمليات مدخالت ومخرجات داخل ذاكرة إلى سالسل‪.‬‬ ‫•‬

‫مركز املكتبة هو عدة فئات للحاويات وعائلة من الخوارزميات الشاملة تتيح لنا كتابة برامج مخترصة وفعالة‪.‬‬
‫تهتم املكتبة بتفاصيل إدارتها – ﻻسيما العناية بإدارة الذاكرة – ‪،‬‬ ‫•‬
‫بحيث تسمح لربامجنا أن تهتم بشأن املشكالت الفعلية اليت نحتاج إلى حلها‪.‬‬ ‫•‬
‫لقد قدمنا نوع حاوية املتجه فيي الفصل الثالث ؛ في الفصل التاسع سنتعرف على تلك الحاوية أكرث ‪،‬‬ ‫•‬
‫وسنغطي أنواع حاويات متسلسلة أخرى أيضاً ‪ ،‬إضافة إلى تغطية عمليات أكرث يوفرها نوع السلسلة‪.‬‬ ‫•‬
‫بإمكاننا أن نعترب السلسلة نوع حاوية خاص يحوي أحرفاً فقط‪ ،‬ويدعم عدة عمليات للحاويات وليس كلها‪.‬‬ ‫•‬
‫أما في الفصل العارش فسنقدم الخوارزميات الشاملة اليت تعمل في العادة على مجموعة عنارص في الحاوية‬ ‫•‬
‫املتسلسلة أو أي تسلسل آخر‪.‬‬
‫تقدم مكتبة الخوارزميات هذه تطبيقات فعالة لعدة خوارزميات كالسيكية كالفرز والبحث ومهام أخرى‪.‬‬ ‫•‬
‫أوجـد اليت تبحث عن‬
‫فمثالً ‪ ،‬ت ُّقدم خوارزمية نسخ‪ ،‬اليت تنسخ العنارص من تسلسل ﻵخر ‪ ،‬وخوارزمية ِ‬ ‫•‬
‫عنرص معني … إلخ‪.‬‬
‫هذه الخوارزميات تعترب شاملة من وجهني ‪،‬‬ ‫•‬
‫اﻷول ‪ :‬أنه يمكن تطبيقها على تسلسالت من أنواع مختلفة ‪،‬‬ ‫•‬
‫والثاني ‪ :‬أن تلك التسلسالت قد تحتوي على عنارص من معظم اﻷنواع‪.‬‬ ‫•‬

‫كما توفر املكتبة عدة حاويات تجميعية وستكون موضوع الفصل الحادي عرش ‪.‬‬
‫الوصول إلى العنارص في الحاويات التجميعية يتم بواسطة مفتاح‪.‬‬ ‫•‬
‫تلك الحاويات تتشارك مع الحاويات املتسلسلة في عمليات عدة وتنفرد بعمليات خاصة بها أيضاً‪.‬‬ ‫•‬

‫نختم هذا الجزء بالفصل الثاني عرش الذي يبحث في أقسام اللغة واملكتبة الخاصة بإدارة الذاكرة الحيوية‪.‬‬
‫يغطي هذا الفصل أحد أهم فئات املكتبة الجديدة وهي ‪ :‬إصدارات املؤرشات الذكية القياسية‪.‬‬ ‫•‬
‫هذه اﻹصدارات تمكننا من عمل أكواد أكرث قوة وصالبة عند استخدام الذاكرة الحيوية‪.‬‬ ‫•‬
‫في نهاية ذلك الفصل سنقدم مثاال ً موسعاً ‪ ،‬نستخدم فيه أقسام املكتبة اليت قُدمت في الجزء الثاني‪.‬‬ ‫•‬
‫الفصــــــــــل ‪ . 8‬مكتبــــــــــة املدخــــــــــالت واملخرجــــــــــات‬
‫‪Chapter 8. The IO Library‬‬

‫الـمحتويات‬
‫‪Contents‬‬

‫‪8.1 The IO Classes‬‬ ‫‪ 8٫1‬فئــــــات املدخــــــالت واملخرجــــــات‬

‫‪8.2 File Input and Output‬‬ ‫‪ 8٫2‬مدخــــــالت ومخرجــــــات امللفــــــات‬

‫‪8.3 string Streams‬‬ ‫‪ 8٫3‬قنــــــوات السلــــــسلــــــة‬

‫‪Chapter Summary‬‬ ‫ملخــــــص الفصــــــل‬

‫‪Defined Terms‬‬ ‫مصطلحــــــات معرفــــــة‬

‫ﻻ تتعامل لغة يس‪ ++‬مبارشة مع املدخالت واملخرجات‪ .‬بدال ً من ذلك ‪،‬‬


‫املعرفة في املكتبة القياسية‪.‬‬
‫ّ‬ ‫يتم التعامل معها بواسطة عائلة من األنواع‬ ‫•‬
‫تدعم هذه األنواع املدخالت واملخرجات من وإلى األجهزة كامللفات ونوافذ وحدة التحكم‪.‬‬ ‫•‬
‫تسمح أنواع إضافية في الذاكرة مدخالت ومخرجات من وإلى السالسل‪.‬‬ ‫•‬
‫تعرف مكتبة املدخالت واملخرجات ‪ IO‬عمليات قراءة وكتابة قيم األنواع املدمجة‪.‬‬
‫ّ‬
‫تعرف فئات – كالسلسلة – عاد ًة عمليات مدخالت ومخرجات مماثلة تعمل على كائنات‬
‫• إضافة إلى ذلك ‪ّ ،‬‬
‫أيضا‪.‬‬
‫من نوع فئتها ً‬
‫سيقدم هذا الفصل أساسيات مكتبة املدخالت واملخرجات‪ .‬أما الفصول الالحقة فستغطي إمكانيات إضافية‪:‬‬
‫سيبحث الفصل ‪ 14‬في كيفية كتابة عوامل املدخالت واملخرجات الخاصة بنا ‪،‬‬ ‫•‬
‫وسيبحث الفصل ‪ 17‬كيفية التحكم في التنسيق وكيفية إجراء الوصول العشوائي إلى امللفات‪.‬‬ ‫•‬
‫لقد استخدمت برامجنا بالفعل العديد من أقسام مكتبة املدخالت واملخرجات‪ .‬في الواقع ‪،‬‬
‫لقد قدمنا معظم هذه األقسام في الفصل الثاني ‪:‬‬
‫النوع ‪( istream‬قناة املدخالت) ‪ ،‬والذي يوفر عمليات املدخالت ‪،‬‬ ‫•‬
‫النوع ‪( ostream‬قناة املخرجات) ‪ ،‬والذي يوفر عمليات املخرجات ‪،‬‬ ‫•‬
‫‪ ، cin‬كائن قناة مدخالت يقرأ املدخالت القياسية ‪،‬‬ ‫•‬
‫‪ ، cout‬كائن قناة مخرجات يكتب إلى املخرجات القياسية ‪،‬‬ ‫•‬
‫‪ ، cerr‬كائن قناة مخرجات ‪ ،‬يستخدم عاد ًة لرسائل خطأ الربنامج ‪ ،‬يكتب على الخطأ القيايس‬ ‫•‬
‫العامل << ‪ ،‬يستخدم لقراءة املدخالت من كائن قناة املدخالت ‪،‬‬ ‫•‬
‫العامل >> ‪ ،‬يستخدم لكتابة املخرجات إلى كائن قناة املخرجات ‪،‬‬ ‫•‬
‫الدالة ‪( getline‬فقرة ‪ ، )2.2.2‬تقرأ سطراً من املدخالت من قناة معينة إلى سلسلة معينة‪.‬‬ ‫•‬
‫‪ . 8٫1‬فئــــــــــات الـمدخــــــــــالت والـمخرجــــــــــات‬
‫‪8.1. The IO Classes‬‬

‫أنواع املدخالت واملخرجات والكائنات اليت استخدمناها حىت اآلن تتعامل مع بيانات األحرف ‪.char‬‬
‫افرتاضياً ‪ ،‬يتم توصيل هذه الكائنات بنافذة وحدة التحكم الخاصة باملستخدم‪ .‬وبالطبع ‪،‬‬ ‫•‬
‫لن تقترص الربامج الحقيقية على إجراء عمليات املدخالت واملخرجات على نافذة وحدة التحكم أو منها فقط ؛‬ ‫•‬
‫بل ستحتاج في الغالب إلى قراءة ملفات مسماة أو الكتابة عليها‪.‬‬ ‫•‬
‫عالوة على ذلك ‪ ،‬قد يكون من املالئم استخدام عمليات مدخالت ‪ /‬مخرجات ملعالجة األحرف في سلسلة‪.‬‬ ‫•‬
‫دعما كبريًا لألحرف‪.‬‬
‫ً‬ ‫أيضا إلى قراءة وكتابة لغات تتطلب‬
‫• قد تضطر التطبيقات ً‬
‫تعرف املكتبة مجموعة أنواع مدخالت ومخرجات‬
‫لدعم هذه األنواع املختلفة من معالجة املدخالت واملخرجات ‪ّ ،‬‬
‫إضافة لتلك اليت استخدمناها بالفعل‪.‬‬
‫• يتم تعريف هذه األنواع ‪ ،‬املدرجة في الجدول ‪ ، 8.1‬في ثالثة عناوين منفصلة‪:‬‬
‫يعرف العنوان ‪ iostream‬األنواع األساسية املستخدمة للقراءة من القناة والكتابة إليها ‪،‬‬
‫ّ‬ ‫•‬
‫ويعرف العنوان ‪ fstream‬األنواع املستخدمة لقراءة امللفات املسماة وكتابتها ‪،‬‬
‫ّ‬ ‫•‬
‫ويعرف العنوان ‪ sstream‬األنواع املستخدمة لقراءة وكتابة سالسل في الذاكرة‪.‬‬
‫ّ‬ ‫•‬

‫الجدول ‪ .8.1‬أنواع وعناوين مكتبة املدخالت واملخرجات‬

‫تعرف املكتبة مجموعة أنواع وكائنات تتعامل مع بيانات اﻷحرف العريضة‪.‬‬


‫لدعم لغات تستخدم أحر ًفا عريضة ‪ّ ،‬‬
‫تبدأ أسماء اإلصدارات ذات األحرف العريضة بالحرف ‪ .w‬فمثالً ‪،‬‬ ‫•‬
‫الكائنات ‪ wcin‬و ‪ wcout‬و ‪ wcerr‬ذات األحرف العريضة تتوافق مع ‪ cin‬و ‪ cout‬و ‪ cerr‬توالياً‪.‬‬ ‫•‬
‫يتم تعريف أنواع وكائنات األحرف العريضة في نفس العنوان كأنواع األحرف العادية‪.‬‬ ‫•‬
‫يعرف العنوان ‪ fstream‬كال النوعني ‪ ifstream‬و ‪. wifstream‬‬
‫كمثال ‪ّ ،‬‬ ‫•‬

‫‪Relationships among the IO Types‬‬ ‫العالقات بني أنواع املدخالت واملخرجات‬

‫من ناحية املفاهيم ‪ ،‬ال يؤثر نوع الجهاز وال حجم الحرف على عمليات املدخالت واملخرجات اليت نريد تنفيذها‪.‬‬
‫فمثالً ‪ ،‬قد نستخدم >> لقراءة بيانات بغض النظر إن كانت من نافذة وحدة تحكم أو ملف قرص أو سلسلة‪.‬‬ ‫•‬
‫وباملثل ‪ ،‬سنستخدم هذا العامل بغض النظر إن كانت األحرف تتناسب مع حرف أو تتطلب أحرفاً عريضة‪.‬‬ ‫•‬
‫تتيح لنا املكتبة تجاهل االختالفات بني هذه األنواع املختلفة من القنوات باستخدام الوراثة‪.‬‬
‫وكما هو حال القوالب ‪ ،‬يمكننا استخدام فئات مرتبطة بالوراثة دون حاجة لفهم تفاصيل كيفية عمل الوراثة‪.‬‬ ‫•‬
‫وسنغطي كيفية دعم يس‪ ++‬للوراثة في الفصل ‪ 15‬والفقرة ‪.18.3‬‬ ‫•‬
‫ولكن باختصار ‪ ،‬تتيح لنا الوراثة أن نقول إن فئة معينة ترث من فئة أخرى‪.‬‬ ‫•‬
‫وفي العادة ‪ ،‬يمكننا استخدام كائن من فئة موروثة كأنه كائن من نفس نوع الفئة اليت ترث منها‪.‬‬ ‫•‬
‫فالنوعان ‪( ifstream‬قناة مدخالت امللفات) و ‪( istringstream‬قناة مدخالت السلسلة) يرثان من‬ ‫•‬
‫قناة املدخالت ‪.istream‬‬
‫بالتالي ‪ ،‬يمكننا استخدام كائنات قناة مدخالت امللفات أو قناة مدخالت السلسلة مثل كائنات قناة املدخالت‪.‬‬ ‫•‬
‫كما يمكننا استخدام كائنات من هذه األنواع بنفس الطرق اليت استخدمنا بها ‪.cin‬‬ ‫•‬
‫فعلى سبيل املثال ‪ ،‬يمكننا استدعاء ‪ getline‬على كائن قناة مدخالت امللفات أو قناة مدخالت السلسلة ‪،‬‬ ‫•‬
‫ويمكننا استخدام >> لقراءة البيانات من قناة مدخالت امللفات أو قناة مدخالت السلسلة‪.‬‬
‫وباملثل ‪ ،‬فإن أنواع ‪ ofstream‬قناة مخرجات امللفات و ‪ ostringstream‬قناة مخرجات السلسلة ترث‬ ‫•‬
‫من قناة املخرجات ‪.ostream‬‬
‫ولذا ‪ ،‬يمكننا استخدام كائنات هذه األنواع بنفس الطرق اليت استخدمنا بها ‪.cout‬‬ ‫•‬

‫ملحوظة‬

‫كل ما نغطيه فيما تبقى من هذا القسم ينطبق بتسا ٍو على القنوات العادية وقنوات امللفات والسلسلة وعلى‬
‫إصدارات القناة ذات األحرف أو األحرف العريضة‪.‬‬

‫‪ 8٫1٫1‬ﻻ نسخ وﻻ تعيني على كائنات املدخالت واملخرجات‬


‫‪8.1.1. No Copy or Assign for IO Objects‬‬

‫كما رأينا في الفقرة ‪ ، 7.1.3‬ال يمكننا النسخ أو التعيني على كائنات أنواع املدخالت أو املخرجات ‪:‬‬

‫;‪ofstream out1, out2‬‬


‫;‪out1 = out2‬‬ ‫‪// error: cannot assign stream objects‬‬
‫‪ofstream print(ofstream); // error: can't initialize the ofstream parameter‬‬
‫;)‪out2 = print(out2‬‬ ‫‪// error: cannot copy stream objects‬‬

‫وألنه من غري املمكن نسخ أنواع املدخالت واملخرجات ‪ ،‬فال يمكننا الحصول على معلمة أو نوع إعادة يمثل أحد‬
‫أنواع القناة‪.‬‬
‫• في العادة تقوم الدوال اليت تعالج عمليات املدخالت واملخرجات بتمرير أو إعادة القناة عرب املراجع‪.‬‬
‫فقراءة أو كتابة كائن املدخالت واملخرجات سيغري من حالته ‪ ،‬ولذلك يجب أال يكون املرجع ثابتاً‪.‬‬ ‫•‬

‫‪8.1.2. Condition States‬‬ ‫‪ 8٫1٫2‬حاﻻت الرشط‬

‫الحقيقة أن األخطاء يمكن أن تحدث‪ .‬فبعضها قابل لالسرتداد ؛ وأخرى تحدث في عمق النظام وتخرج عن إمكانيات‬
‫الربنامج من أجل تصحيحها‪.‬‬
‫تعرف فئات املدخالت واملخرجات الدوال والعالمات ‪ ،‬املدرجة في الجدول ‪، 8.2‬‬
‫ّ‬ ‫•‬
‫واليت تتيح لنا الوصول إلى حالة القناة والتعامل معها‪.‬‬ ‫•‬

‫الجدول ‪ .8.2‬حالة مكتبة املدخالت واملخرجات‬

‫فكر في الكود التالي‪:‬‬


‫كمثال على خطأ املدخالت واملخرجات ‪ّ ،‬‬

‫;‪int ival‬‬
‫;‪cin >> ival‬‬

‫إذا أدخلنا ‪ Boo‬إلى تلك املدخالت القياسية ‪ ،‬فستفشل القراءة‪ .‬ﻷن عامل املدخالت قد توقع قراءة ‪، int‬‬
‫لكنه حصل على الحرف ‪ B‬بدال ً من ذلك‪ .‬ونتيجة لذلك ‪،‬‬ ‫•‬
‫سيتم وضع ‪ cin‬في حالة خطأ‪ .‬وباملثل ‪ ،‬فإن ‪ cin‬في حالة خطأ لو صادفنا نهاية ملف‪.‬‬ ‫•‬
‫بمجرد حدوث خطأ ‪ ،‬ستفشل عمليات املدخالت ‪ /‬املخرجات الالحقة على تلك القناة‪.‬‬ ‫•‬
‫ومن ثم ‪ ،‬ال يمكننا القراءة من القناة أو الكتابة عليها إال عندما تكون في حالة عدم الخطأ‪.‬‬ ‫•‬
‫وألن أي قناة قد تكون في حالة خطأ ‪ ،‬ينبغي على الكود عاد ًة فحص كون القناة صالحة قبل محاولة‬ ‫•‬
‫استخدامها‪.‬‬
‫وأسهل طريقة لتحديد حالة كائن القناة هي استخدام ذلك الكائن كرشط‪:‬‬ ‫•‬

‫)‪while (cin >> word‬‬


‫‪    // ok: read operation successful . . .‬‬

‫يتحقق رشط طالـما_ ‪ while‬من حالة القناة املعادة من تعبري >>‪.‬‬ ‫•‬
‫فإن نجحت عملية املدخالت هذه ‪ ،‬ستبقى الحالة صالحة وينجح الرشط‪.‬‬ ‫•‬

‫‪Interrogating the State of a Stream‬‬ ‫استخبار حالة قناة‬


‫ﻻ يخربنا استخدام قناة كرشط إﻻ من ناحية ما إن كانت صالحة‪ .‬وليس من ناحية إخبارنا عما حدث‪.‬‬
‫• لكن أحياناً سنحتاج أيضاً إلى معرفة سبب عدم صالحية القناة‪.‬‬
‫• مثالً ‪ ،‬يحتمل أن يختلف ما نفعله عند مصادفة نهاية ملف عما سنفعله عند مواجهة خطأ على جهاز‬
‫املدخالت أو املخرجات‪.‬‬
‫نوعا متكاماًل يعتمد على اآللة يسمى ‪( iostate‬حالة املدخالت املخرجات)‬
‫تعرف مكتبة املدخالت واملخرجات ً‬ ‫ّ‬
‫تستخدمه لنقل املعلومات حول حالة القناة‪.‬‬
‫• يُستخدم هذا النوع كمجموعة بتات ‪ ،‬بنفس طريقة استخدامنا متغري ‪ quiz1‬في فقرة ‪. 4.8‬‬
‫تعرف فئات املدخالت واملخرجات أربع قيم ثابتة من نوع ‪ iostate‬تمثل أنماط بتات معينة‪.‬‬
‫ّ‬ ‫•‬
‫تُستخدم هذه القيم لإلشارة إلى أنواع معينة من حاﻻت املدخالت أو املخرجات‪.‬‬ ‫•‬
‫يمكن استخدامها مع عوامل البت (الفقرة ‪ )4.8‬الختبار أو ضبط أعالم متعددة في عملية واحدة‪.‬‬ ‫•‬
‫‪ .1‬يشري بت_يسء ‪ badbit‬إلى فشل في النظام ‪ ،‬مثل خطأ في قراءة أو كتابة غري قابل لالسرتداد‪.‬‬
‫وعادة ال يمكن استخدام قناة بمجرد ضبطها على بت_يسء ‪.badbit‬‬
‫‪ .2‬يتم الضبط على بت_فاشل ‪ failbit‬بعد خطأ قابل لالسرتداد ‪ ،‬مثل قراءة حرف بينما يُتوقع عدد‪.‬‬
‫وغالباً ما يكون من املمكن تصحيح مثل هذه املشكالت واالستمرار في استخدام القناة‪.‬‬
‫‪ .3‬يؤدي مصادفة نهاية ملف إلى الضبط على كل من بت_نهاية_ملف ‪ eofbit‬وبت_فاشل ‪.failbit‬‬
‫‪ .4‬يشري بت_جيد ‪ ، goodbit‬الذي تضمن اللغة احتوائه على قيمة ‪ ، 0‬إلى عدم وجود إخفاقات في القناة‪.‬‬
‫إذا تم الضبط على أي من ‪ badbit‬أو ‪ failbit‬أو ‪ ، eofbit‬فسيفشل الرشط الذي يقيم هذه القناة‪.‬‬ ‫•‬
‫أيضا مجموعة من الدوال ﻻستخبار حالة هذه األعالم‪.‬‬
‫تعرف املكتبة ً‬
‫ّ‬
‫تعود العملية ‪ good‬بقيمة صحيحة إذا لم يتم الضبط على أي من بتات الخطأ‪.‬‬ ‫•‬
‫تعود العمليات ‪ bad‬و ‪ fail‬و ‪ eof‬بقيمة صحيحة عند تشغيل البت املقابل‪.‬‬ ‫•‬
‫إضافة إلى ذلك ‪ ،‬يعود ‪ fail‬بقيمة صحيحة إذا تم الضبط على ‪.bad‬‬ ‫•‬
‫بشكل ضمين ‪ ،‬فإن الطريقة الصحيحة لتحديد الحالة العامة للقناة هي استخدام إما ‪ good‬أو ‪.fail‬‬ ‫•‬
‫في الواقع ‪ ،‬الكود الذي يتم تنفيذه عندما نستخدم قنا ًة كرشط يعادل استدعاء ()‪. !fail‬‬ ‫•‬
‫ﻻ تكشف العمليات ‪ eof‬و ‪ bad‬إﻻ ما إذا كانت هذه األخطاء املحددة قد حدثت أم ال‪.‬‬ ‫•‬

‫‪Managing the Condition State‬‬ ‫إدارة حالة الرشط‬

‫يعيد العضو ‪ rdstate‬قيمة ‪ iostate‬تتوافق مع حالة القناة الحالية‪.‬‬


‫تقوم العملية ‪ setstate‬بتشغيل بتـ (ــات) الحالة املحددة لتشري إلى حدوث مشكلة‪.‬‬ ‫•‬
‫العضو ‪ clear‬زائد التعبئة ‪ :‬فإصدار منه ال يأخذ أي وسيطات وآخر يأخذ وسيطة من نوع ‪.iostate‬‬ ‫•‬
‫إصدار ‪ clear‬الذي ال يأخذ أي وسيطات يوقف كل بتات الفشل ‪.fail‬‬ ‫•‬
‫بعد ()‪ ، clear‬يعود استدعاء ‪ good‬بقيمة صحيحة‪.‬‬ ‫•‬
‫قد نستخدم هذه األعضاء على النحو التالي‪:‬‬ ‫•‬

‫‪// remember the current state of cin‬‬


‫;)(‪auto old_state = cin.rdstate‬‬ ‫‪// remember current state of cin‬‬
‫;)(‪cin.clear‬‬ ‫‪// make cin valid‬‬
‫;)‪process_input(cin‬‬ ‫‪// use cin‬‬
‫;)‪cin.setstate(old_state‬‬ ‫‪// now reset cin to its old state‬‬

‫اإلصدار ‪ clear‬الذي يأخذ وسيطة يتوقع قيمة ‪ iostate‬تمثل الحالة الجديدة للقناة‪.‬‬ ‫•‬
‫إليقاف تشغيل رشط واحد ‪ ،‬نستخدم العضو ‪ rdstate‬وعوامل البتات إلنتاج الحالة الجديدة املطلوبة‪.‬‬ ‫•‬
‫فمثالً ‪ ،‬يؤدي ما يلي إلى إيقاف تشغيل ‪ failbit‬و ‪ badbit‬ولكنه يرتك ‪ eofbit‬كما هو ‪:‬‬ ‫•‬

‫‪// turns off failbit and badbit but all other bits unchanged‬‬
‫;)‪cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit‬‬

‫تمارين القسم ‪8.1.2‬‬

‫التمرين ‪:8.1‬‬
‫‪ -‬اكتب دالة تأخذ وتعيد مرجع قناة املدخالت &‪.‬‬
‫‪ -‬يجب أن تقرأ الدالة القناة حىت تصادف نهاية ملف‪.‬‬
‫‪ -‬يجب أن تطبع الدالة ما تقرأه على املخرجات القياسية‪.‬‬
‫‪ -‬أعد تعيني القناة بحيث تكون صالحة قبل إعادة القناة‪.‬‬

‫التمرين ‪:8.2‬‬
‫‪ -‬اخترب دالتك من خالل استدعاءها ‪ ،‬وتمرير ‪ cin‬كوسيطة‪.‬‬

‫التمرين ‪:8.3‬‬
‫ما الذي يتسبب في إنهاء طالـما_ التالية؟‬
‫‪while (cin >> i) /*...*/‬‬

‫‪8.1.3. Managing the Output Buffer‬‬ ‫‪ 8٫1٫3‬إدارة مخزن املخرجات املؤقت‬

‫تدير كل قناة مخرجات مخز ًنا مؤق ًتا تستخدمه لتحتفظ بالبيانات اليت يقرأها الربنامج ويكتبها‪.‬‬
‫فعلى سبيل املثال ‪ ،‬عند تنفيذ الكود التالي‬

‫;" ‪os << "please enter a value:‬‬

‫قد تتم طباعة السلسلة الحرفية على الفور ‪ ،‬أو قد يتم تخزين البيانات في مخزن مؤقت لطباعتها الح ًقا‪.‬‬ ‫•‬
‫يسمح استخدام املخزن املؤقت للنظام بدمج عدة عمليات مخرجات من برنامجنا في كتابة واحدة على‬ ‫•‬
‫مستوى النظام‪.‬‬
‫ونظرًا ألن الكتابة على جهاز يمكن أن تستغرق وق ًتا طويالً ‪،‬‬ ‫•‬
‫فإن السماح للنظام بدمج عدة عمليات مخرجات في عملية كتابة واحدة قد يوفر تعزي ًزا مهماً لألداء‪.‬‬ ‫•‬
‫هناك عدة حاﻻت تؤدي إلى مسح املخزن املؤقت من ‪ -‬أي أن تتم كتابته على ‪ -‬جهاز أو ملف املخرجات الفعلي ‪:‬‬
‫أن يكتمل الربنامج بشكل طبيعي‪ .‬حيث يتم مسح كل مخازن املخرجات املؤقتة كجزء من العائد من ‪.main‬‬ ‫•‬
‫في وقت غري محدد ‪ ،‬يمكن أن يمتلئ املخزن املؤقت ‪ ،‬وفي تلك الحالة سيتم مسحه قبل كتابة القيمة التالية‪.‬‬ ‫•‬
‫ويمكننا مسح املخزن املؤقت بشكل رصيح باستخدام معالج مثل ‪. endl‬‬ ‫•‬
‫كما يمكننا استخدام املعالج ‪ unitbuf‬لضبط حالة القناة الداخلية إلفراغ املخزن املؤقت بعد كل عملية‬ ‫•‬
‫مخرجات‪.‬‬
‫افرتاضياً ‪ ،‬يتم تعيني ‪ unitbuf‬على ‪ ، cerr‬بحيث يتم مسح عمليات الكتابة إلى ‪ cerr‬على الفور‪.‬‬ ‫•‬
‫قد تكون قناة املخرجات مرتبطة بقناة أخرى‪.‬‬ ‫•‬
‫في تلك الحالة ‪ ،‬يتم مسح املخزن املؤقت للقناة املرتبطة كلما تمت قراءة القناة املرتبطة أو الكتابة عليها‪.‬‬ ‫•‬
‫افرتاضياً ‪ ،‬يتم ربط كل من ‪ cin‬و ‪ cerr‬بـ ‪ .cout‬ومن ثم ‪ ،‬فإن أي قراءة من ‪ cin‬أو كتابة على ‪cerr‬‬ ‫•‬
‫تمسح املخزن املؤقت في ‪.cout‬‬

‫‪Flushing the Output Buffer‬‬ ‫تفريغ مخزن املخرجات املؤقت‬

‫لقد استخدمت برامجنا بالفعل املعالج ‪ ، endl‬والذي ينهي السطر الحالي ويمسح املخزن املؤقت‪.‬‬
‫هناك نوعان من املعالجات اﻷخرى املتشابهة ‪ flush :‬و ‪.ends‬‬ ‫•‬
‫يفرغ ‪ flush‬القناة لكنه لن يضيف أي أحرف إلى املخرجات ؛‬
‫ّ‬ ‫•‬
‫بينما تقوم ‪ ends‬بإدراج حرف فارغ في املخزن املؤقت ثم تمسحه ‪:‬‬ ‫•‬

‫;‪cout << "hi!" << endl‬‬ ‫‪// writes hi and newline, then flushes buffer‬‬
‫;‪cout << "hi!" << flush‬‬ ‫‪// writes hi, then flushes buffer; adds no data‬‬
‫;‪cout << "hi!" << ends‬‬ ‫‪// writes hi and null, then flushes buffer‬‬

‫‪The unitbuf Manipulator‬‬ ‫املعالج وحدة_املخزن‬

‫إذا أردنا التنظيف بعد كل عملية مخرجات ‪ ،‬فيمكننا استخدام املعالج ‪.unitbuf‬‬
‫والذي يخرب القناة بالقيام بعملية مسح بعد كل كتابة الحقة‪.‬‬ ‫•‬
‫يستعيد املعالج ‪ nounitbuf‬القناة الستخدام قناة املخزن املؤقت العادي الذي يديره النظام‪:‬‬ ‫•‬

‫;‪cout << unitbuf‬‬ ‫‪// all writes will be flushed immediately‬‬


‫‪// any output is flushed immediately, no buffering‬‬
‫;‪cout << nounitbuf‬‬ ‫‪// returns to normal buffering‬‬

‫احذر‪ :‬ال يتم مسح املخازن املؤقتة في حالة تعطل الربنامج‬


‫‪Caution: Buffers Are Not Flushed If the Program Crashes‬‬

‫ال يتم مسح املخازن املؤقتة للمخرجات إذا انتهى الربنامج بشكل غري طبيعي‪.‬‬ ‫•‬
‫فعند تعطل أحد الربامج ‪،‬‬ ‫•‬
‫يحتمل أن تكون البيانات اليت كتبها الربنامج في مخزن مخرجات مؤقت بانتظار طباعتها‪.‬‬ ‫•‬
‫عند تصحيح أخطاء برنامج تعطل ‪،‬‬ ‫•‬
‫من الرضوري التأكد من مسح أي مخرجات يعتقد أنه كان ينبغي كتابتها‪.‬‬ ‫•‬
‫يتم إهدار ساعات ال حرص لها من وقت املربمج في التتبع عرب أكواد يبدو أنها لم يتم تنفيذها ؛‬ ‫•‬
‫بينما هي في الواقع عدم مسح املخزن املؤقت وكانت املخرجات معلقة عند تعطل الربنامج‪.‬‬ ‫•‬

‫ربط قنوات املدخالت واملخرجات معا ً‬


‫‪Tying Input and Output Streams Together‬‬
‫عندما يتم ربط قناة املدخالت بقناة املخرجات ‪،‬‬
‫فإن أي محاولة لقراءة قناة املدخالت ستعمل أوال ً على مسح املخزن املؤقت املرتبط بقناة املخرجات‪.‬‬ ‫•‬
‫تقوم املكتبة بربط ‪ cout‬بـ ‪ ، cin‬لذا فإن الجملة‬ ‫•‬

‫;‪cin >> ival‬‬

‫تتسبب في مسح املخزن املؤقت املرتبط بـ ‪.cout‬‬

‫ملحوظة‬

‫ينبغي أن تربط األنظمة التفاعلية عادة قناة املدخالت بقناة املخرجات‪ .‬فالقيام بذلك سيعين ‪:‬‬ ‫•‬
‫أن أية مخرجات – قد تتضمن مطالبات للمستخدم – ستتم كتابتها قبل محاولة قراءة أية مدخالت‪.‬‬ ‫•‬

‫هناك نوعان من اإلصدارات زائدة التعبئة لـلرابط ‪: tie‬‬


‫حاليا‪.‬‬
‫ً‬ ‫إصدار ال يأخذ أي وسيطة ويعيد مؤرشًا إلى قناة مخرجات ‪ ،‬إن وجدت ‪ ،‬يرتبط به هذا الكائن‬ ‫•‬
‫تقوم الدالة بإعادة مؤرش فارغ إذا لم يتم ربط القناة‪.‬‬ ‫•‬
‫يأخذ إصدار ثان مؤرشًا إلى قناة املخرجات ويربط نفسه بقناة املخرجات تلك‪.‬‬ ‫•‬
‫هذا يعين أن )‪ x.tie(& o‬سريبط القناة ‪ x‬بقناة املخرجات ‪.o‬‬ ‫•‬
‫يمكننا ربط كائن قناة مدخالت أو قناة مخرجات بـ قناة مخرجات أخرى ‪:‬‬ ‫•‬

‫;)‪cin.tie(&cout‬‬ ‫‪// illustration only: library ties cin and cout for us‬‬
‫‪// old_tie points to stream (if any) currently tied to cin‬‬
‫‪ostream *old_tie = cin.tie(nullptr); // cin is no longer tied‬‬
‫‪// ties cin and cerr; not a good idea because cin should be tied to cout‬‬
‫;)‪cin.tie(&cerr‬‬ ‫‪// reading cin flushes cerr, not cout‬‬
‫‪cin.tie(old_tie); // reestablish normal tie between cin and cout‬‬

‫لربط قناة معينة بقناة مخرجات جديدة ‪ ،‬نقوم بتمرير مؤرش ربط إلى القناة الجديدة‪.‬‬ ‫•‬
‫فارغا‪.‬‬
‫ً‬ ‫لفك ربط القناة بالكامل ‪ ،‬نمرر مؤرشًا‬ ‫•‬
‫يمكننا ربط كل قناة بقناة واحد على األكرث في كل مرة‪ .‬مع ذلك ‪،‬‬ ‫•‬
‫يمكن أن تربط قنوات متعددة نفسها بنفس قناة املخرجات‪.‬‬ ‫•‬
‫‪ . 8٫2‬مدخــــــــــالت ومخرجــــــــــات الـملـفــــــــات‬
‫‪8.2. File Input and Output‬‬

‫يعرف العنوان ‪ fstream‬ثالثة أنواع لدعم ملف املدخالت واملخرجات ‪:‬‬


‫ّ‬
‫‪( ifstream‬قناة مدخالت امللفات) للقراءة من ملف معني ‪،‬‬ ‫•‬
‫‪( ofstream‬قناة مخرجات امللفات) للكتابة إلى ملف معني ‪،‬‬ ‫•‬
‫‪( fstream‬قناة امللفات) اليت يقرأ ويكتب ملفاً معيناً‪.‬‬ ‫•‬
‫سنرشح في فقرة ‪ 17٫5.3‬كيفية استخدام نفس امللف لكل من املدخالت واملخرجات‪.‬‬ ‫•‬
‫توفر هذه األنواع نفس العمليات اليت استخدمناها ساب ًقا في الكائنات ‪ cin‬و ‪.cout‬‬
‫وباﻷخص ‪ ،‬يمكننا استخدام عوامل املدخالت واملخرجات (<< و >>) لقراءة امللفات وكتابتها ‪،‬‬ ‫•‬
‫ويمكننا استخدام ‪ getline‬لقراءة قناة مدخالت امللفات ‪ ،‬ومواد الفقرة ‪ 8.1‬اليت تنطبق على هذه األنواع‪.‬‬ ‫•‬
‫إضافة إلى السلوك الذي ترثه من أنواع قناة املدخالت واملخرجات ‪،‬‬ ‫•‬
‫املعرفة في ‪ fstream‬تضيف أعضاء إلدارة امللف املرتبط بالقناة‪.‬‬
‫ّ‬ ‫فإن األنواع‬ ‫•‬
‫يمكن استدعاء هذه العمليات ‪ ،‬املدرجة في الجدول ‪ ، 8.3‬على كائنات ‪ fstream‬أو ‪ ifstream‬أو‬ ‫•‬
‫‪ ofstream‬لكن ليس على أنواع املدخالت واملخرجات األخرى‪.‬‬

‫معرفة قناة امللفات‬


‫الجدول ‪ .8.3‬عمليات ّ‬

‫‪8.2.1. Using File Stream Objects‬‬ ‫‪ 8٫2٫1‬استخدام كائنات قناة امللفات‬

‫نعرف كائن قناة ملف ونربط هذا الكائن بامللف‪.‬‬


‫عندما نريد قراءة ملف أو الكتابة عليه ‪ ،‬فإننا ّ‬
‫تعرف كل فئة قناة ملف دالة عضو تسمى ‪، open‬‬
‫ّ‬ ‫•‬
‫تقوم بأي عمليات مطلوبة لدى النظام لتعريف موقع امللف املحدد وفتحه لقراءة أو كتابة حسب االقتضاء‪.‬‬ ‫•‬
‫عندما نقوم بإنشاء قناة ملف ‪ ،‬يمكننا (اختيارياً) توفري اسم ملف‪.‬‬ ‫•‬
‫عندما ّ‬
‫نوفر اسم امللف ‪ ،‬سيتم استدعاء فتح تلقائياً ‪:‬‬ ‫•‬
‫‪ifstream in(ifile); // construct ifstream and open given file‬‬
‫;‪ofstream out‬‬ ‫‪// output file stream that is not associated with any file‬‬

‫عرف هذا الكود ‪ in‬كقناة مدخالت تمت تهيئتها على القراءة من ملف مسمى بواسطة وسيطة السلسلة‬
‫يُ ّ‬ ‫•‬
‫‪.ifile‬‬
‫يتم تعريف ‪ out‬كقناة مخرجات غري مرتبطة بعد بملف‪.‬‬ ‫•‬
‫باستخدام املعيار الجديد ‪ ،‬يمكن أن تكون أسماء امللفات إما سالسل مكتبة أو مصفوفات أحرف النمط ‪.C‬‬ ‫•‬
‫كانت اإلصدارات السابقة من املكتبة تسمح فقط بمصفوفات أحرف النمط ‪.C‬‬ ‫•‬

‫استخدام قناة ملفات مكان مرجع قناة مدخالت ومخرجات‬


‫&‪Using an fstream in Place of an iostream‬‬

‫كما أرشنا في الفقرة ‪ ، 8.1‬يمكننا استخدام كائن من نوع موروث في أماكن يتوقع فيها كائن نوع أصلي‪.‬‬
‫• تعين هذه الحقيقة أنه يمكن استدعاء دوال تمت كتابتها ألخذ مرجع (أو مؤرش) ألحد أنواع قناة املدخالت‬
‫واملخرجات نيابة عن نوع قناة امللفات (أو ‪ sstream‬قناة السلسلة) املقابلة‪.‬‬
‫• بمعىن ‪ ،‬إذا كانت لدينا دالة تأخذ مرجع قناة مخرجات & ‪،‬‬
‫فيمكننا استدعاء هذه الدالة بتمرير كائن قناة مخرجات امللفات ‪ ،‬وباملثل لـقناة املدخالت و قناة مدخالت‬ ‫•‬
‫امللفات لها‬
‫مثالً ‪ ،‬يمكننا استخدام الدوال قراءة وطباعة من فقرة ‪ 7.1.3‬للقراءة من ملفات مسماة والكتابة عليها‪.‬‬ ‫•‬
‫في هذا املثال ‪ ،‬سنفرتض أن أسماء ملفات املدخالت واملخرجات يتم تمريرها كوسيطات إلى ‪: main‬‬ ‫•‬

‫;)]‪ifstream input(argv[1‬‬ ‫‪// open file of sales transactions‬‬


‫;)]‪ofstream output(argv[2‬‬ ‫‪// open output file‬‬
‫;‪Sales_data total‬‬ ‫‪// variable to hold running sum‬‬
‫{ ))‪if (read(input, total‬‬ ‫‪// read first transaction‬‬
‫;‪    Sales_data trans‬‬ ‫‪// variable to hold data for next transaction‬‬
‫{ ))‪    while(read(input, trans‬‬ ‫‪// read remaining transactions‬‬
‫‪        if (total.isbn() == trans.isbn()) // check isbns‬‬
‫;)‪            total.combine(trans‬‬ ‫‪// update running total‬‬
‫{ ‪        else‬‬
‫‪            print(output, total) << endl; // print results‬‬
‫;‪            total = trans‬‬ ‫‪// process next book‬‬
‫}‪        ‬‬
‫}‪    ‬‬
‫;‪    print(output, total) << endl‬‬ ‫‪// print last transaction‬‬
‫‪} else‬‬ ‫‪// there was no input‬‬
‫;‪    cerr << "No data?!" << endl‬‬

‫وبرصف النظر عن استخدام ملفات مسماة ‪ ،‬فإن هذا الكود مطابق تقريبًا إلصدار برنامج اإلضافة السابق‪.‬‬ ‫•‬
‫الجزء املهم هو استدعاءات قراءة وطباعة‪.‬‬ ‫•‬
‫يمكننا تمرير كائناتنا قناة ملفات إلى هذه الدوال بالرغم من أن معلماتها يتم تعريفها كمراجع قناة مدخالت‬ ‫•‬
‫ومراجع قناة مخرجات ‪ ،‬على التوالي‪.‬‬
‫‪The open and close Members‬‬ ‫اﻷعضاء فتح_ وإغالق_‬

‫نعرف كائن قناة ملف فارغ ‪ ،‬يمكننا فيما بعد ربط هذا الكائن بملف عن طريق استدعاء ‪:open‬‬
‫عندما ّ‬

‫‪ifstream in(ifile); // construct an ifstream and open the given file‬‬


‫;‪ofstream out‬‬ ‫‪// output file stream that is not associated with any file‬‬
‫;)"‪out.open(ifile + ".copy‬‬ ‫‪// open the specified file‬‬

‫إذا فشل استدعاء فتح_ ‪ ،‬يتم ضبط القناة على بت_فاشل ‪.failbit‬‬ ‫•‬
‫ونظرًا الحتمال فشل اﻻستدعاء على املراد فتحه ‪ ،‬فمن األفضل عاد ًة التحقق من نجاح فتح_ ‪:‬‬ ‫•‬

‫)‪if (out‬‬ ‫‪// check that open succeeded‬‬


‫‪// open succeeded, so we can use file‬‬

‫هذه الحالة مشابهة لتلك اليت استخدمناها مع ‪.cin‬‬ ‫•‬


‫فإن فشل فتح_ ‪ ،‬فستفشل حالة القناة هذه ولن نحاول استخدامها‪.‬‬ ‫•‬
‫وبمجرد فتح قناة ملف ‪ ،‬ستظل مرتبطة بامللف املحدد‪ .‬في الواقع ‪،‬‬ ‫•‬
‫إن استدعاء فتح_ على قناة ملف مفتوحة بالفعل سيُفشل الفتح ويضبط حالتها على ‪.failbit‬‬ ‫•‬
‫وستفشل املحاوالت الالحقة الستخدام قناة امللف تلك‪.‬‬ ‫•‬
‫ولربط قناة ملف بملف مختلف ‪ ،‬يجب أوال ً إغالق أي ملف حالي‪.‬‬ ‫•‬
‫وبمجرد إغالق امللف ‪ ،‬يمكننا فتح ملف جديد‪:‬‬ ‫•‬

‫;)(‪in.close‬‬ ‫‪// close the file‬‬


‫;)"‪in.open(ifile + "2‬‬ ‫‪// open another file‬‬

‫إن نجح فتح_ ‪ ،‬فإن الفتح يضبط حالة القناة بحيث تكون ()‪ good‬قيمة صحيحة‪.‬‬ ‫•‬

‫‪Automatic Construction and‬‬


‫‪Destruction‬‬ ‫اﻹنشاء والتدمري التلقائي‬

‫فك ر في برنامج تأخذ دالته الرئيسية قائمة بملفات ينبغي معالجتها‪ .‬فقد يحتوي برنامج كهذا على حلقة مثل ‪:‬‬
‫ّ‬

‫‪// for each file passed to the program‬‬


‫{ )‪for (auto p = argv + 1; p != argv + argc; ++p‬‬
‫;)‪    ifstream input(*p‬‬ ‫‪// create input and open the file‬‬
‫{ )‪    if (input‬‬ ‫‪// if the file is ok, ''process'' this file‬‬
‫;)‪        process(input‬‬
‫‪    } else‬‬
‫;)‪        cerr << "couldn't open: " + string(*p‬‬
‫‪} // input goes out of scope and is destroyed on each iteration‬‬

‫ينئش كل تكرار كائن قناة مدخالت ملف جدي ًدا باسم ‪ input‬ويفتحه لقراءة امللف املحدد‪.‬‬ ‫•‬
‫كالعادة ‪ ،‬نتحقق من نجاح الفتح‪ .‬فإن كان ناجحاً ‪،‬‬ ‫•‬
‫فإننا نمرر هذا امللف إلى دالة من شأنها قراءة املدخالت ومعالجتها‪.‬‬ ‫•‬
‫إن لم ينجح الفتح ‪ ،‬سنطبع رسالة خطأ ونستمر‪.‬‬ ‫•‬
‫ونظرًا ألن املدخالت محلية التعريف في حلقة ﻷجل_ ‪ ،‬يتم إنشاؤها وإتالفها مع كل تكرار‪.‬‬ ‫•‬
‫تلقائيا‪.‬‬
‫ً‬ ‫عندما يخرج كائن قناة امللفات من النطاق ‪ ،‬يتم إغالق امللف املرتبط به‬ ‫•‬
‫في التكرار التالي ‪ ،‬يتم إنشاء املدخالت من جديد‪.‬‬ ‫•‬

‫ملحوظة‬

‫تلقائيا‪.‬‬
‫ً‬ ‫عندما يتم تدمري كائن قناة ملفات ‪ ،‬يتم استدعاء إغالق_‬

‫قسم التمارين ‪8.2.1‬‬

‫التمرين ‪:8.4‬‬
‫‪ -‬اكتب دالة لفتح ملف للمدخالت وقراءة محتوياته في متجه من السالسل ‪ ،‬وتخزين كل سطر كعنرص منفصل في‬
‫املتجه‪.‬‬

‫التمرين ‪:8.5‬‬
‫‪ -‬أعد كتابة الربنامج السابق لتخزين كل كلمة في عنرص منفصل‪.‬‬

‫التمرين ‪:8.6‬‬
‫‪ -‬أعد كتابة برنامج متجر الكتب من الفقرة ‪ 7.1.1‬لقراءة معامالته من ملف‪.‬‬
‫‪ -‬قم بتمرير اسم امللف كوسيطة إلى ‪. main‬‬

‫‪8.2.2. File Modes‬‬ ‫‪ 8٫2٫2‬أوضاع الـملف‬

‫تحتوي كل قناة على وضع ملف مرتبط يمثل كيفية استخدام امللف‪.‬‬
‫يرسد الجدول ‪ 8.4‬أوضاع امللفات ومعانيها‪.‬‬

‫الجدول ‪ .8.4‬أوضاع امللف‬

‫يمكننا توفري وضع ملف عندما نفتح مل ًفا ‪ -‬إما عندما نستدعي فتح_ أو عندما نفتح ملفاً بشكل غري مبارش عند‬
‫تهيئة قناة على اسم ملف‪ .‬األوضاع اليت يمكننا تعريفها تملك القيود التالية‪:‬‬
‫• ﻻ يسمح بالضبط على ‪ out‬إﻻ لكائن قناة مخرجات ملفات ‪ ofstream‬أو قناة ملفات ‪.fstream‬‬
‫ﻻ يسمح بالضبط على ‪ in‬إﻻ لكائن قناة مدخالت ملفات ‪ ifstream‬أو قناة ملفات ‪.fstream‬‬ ‫•‬
‫أيضا‪.‬‬
‫ﻻ يمكن الضبط على ‪ trunc‬إﻻ عندما يتم تحديد ‪ً out‬‬ ‫•‬
‫يمكن تعريف وضع ‪ app‬طاملا لم يتم تحديد ‪.trunc‬‬ ‫•‬
‫دائما في وضع ‪ ، out‬حىت لو لم يتم تحديد ‪ out‬رصاحة‪.‬‬
‫ً‬ ‫إذا تم تعريف ‪ ، app‬فسيتم فتح امللف‬ ‫•‬
‫افرتاضياً ‪ ،‬يتم اقتطاع امللف املفتوح في وضع ‪ out‬حىت إن لم نحدد ‪.trunc‬‬ ‫•‬
‫أيضا تحديد ‪، app‬‬
‫لالحتفاظ بمحتويات ملف مفتوح في وضع ‪ ، out‬فإما يجب علينا ً‬ ‫•‬
‫وفي هذه الحالة يمكننا الكتابة فقط إلى آخر امللف ‪،‬‬ ‫•‬
‫مفتوحا لكل من املدخالت واملخرجات‪.‬‬
‫ً‬ ‫أو يجب علينا أيضاً تحديد ‪ ، in‬وفي تلك الحالة يكون امللف‬ ‫•‬
‫(الفقرة ‪ 17.5.3‬تغطي استخدام نفس امللف للمدخالت واملخرجات)‪.‬‬ ‫•‬
‫يمكن تحديد وضعي ‪ ate‬و‪ binary‬على أي نوع كائن قناة ملف مقرتناً مع أي أوضاع ملف أخرى‪.‬‬ ‫•‬
‫يحدد كل نوع قناة ملف وضع ملف افرتايض يتم استخدامه عندما ال نحدد وضعاً بطريقة أخرى‪.‬‬
‫فيتم فتح امللفات املرتبطة بـ قناة مدخالت ملفات في الوضع ‪ in‬؛‬ ‫•‬
‫ويتم فتح امللفات املرتبطة بـ قناة مخرجات ملفات في الوضع ‪ out‬؛‬ ‫•‬
‫وامللفات املرتبطة بـ قناة ملفات يتم فتحها بأوضاع ‪ in‬و ‪.out‬‬ ‫•‬

‫فتح ملف في وضع ‪ out‬سيتجاهل البيانات الحارضة‬


‫‪Opening a File in out Mode Discards Existing Data‬‬

‫افرتاضياً ‪ ،‬عندما نفتح قناة مخرجات ملف ‪ ، ofstream‬يتم تجاهل محتويات امللف‪.‬‬
‫والطريقة الوحيدة ملنع قناة مخرجات ملف من إفراغ امللف املحدد هي تحديد وضع اﻹلحاق ‪: app‬‬ ‫•‬

‫‪// file1 is truncated in each of these cases‬‬


‫;)"‪ofstream out("file1‬‬ ‫‪// out and trunc are implicit‬‬
‫;)‪ofstream out2("file1", ofstream::out‬‬ ‫‪// trunc is implicit‬‬
‫;)‪ofstream out3("file1", ofstream::out | ofstream::trunc‬‬
‫‪// to preserve the file's contents, we must explicitly specify app mode‬‬
‫;)‪ofstream app("file2", ofstream::app‬‬ ‫‪// out is implicit‬‬
‫;)‪ofstream app2("file2", ofstream::out | ofstream::app‬‬

‫تحذير‬

‫الطريقة الوحيدة للحفاظ على بيانات موجودة في ملف مفتوح بواسطة قناة مخرجات ملفات هي تحديد‬
‫وضع اﻹلحاق ‪ app‬أو وضع املدخالت ‪ in‬بشكل رصيح‪.‬‬

‫يتم تحديد وضع امللف عند كل استدعاء للفتح‬


‫‪File Mode Is Determined Each Time open Is Called‬‬

‫قد يتغري وضع ملف لقناة معينة في كل مرة يتم فيها فتح امللف‪.‬‬
‫;‪ofstream out‬‬ ‫‪// no file mode is set‬‬
‫;)"‪out.open("scratchpad‬‬ ‫‪// mode implicitly out and trunc‬‬
‫;)(‪out.close‬‬ ‫‪// close out so we can use it for different file‬‬
‫;)‪out.open("precious", ofstream::app‬‬ ‫‪// mode is out and app‬‬
‫;)(‪out.close‬‬

‫أول استدعاء سيتم فتحه ال يحدد الوضع ‪ out‬بشكل رصيح ؛ سيتم الفتح ضمنياً في وضع ‪.out‬‬ ‫•‬
‫وكالعادة ‪ ،‬يتضمن وضع ‪ out‬وضع اﻻقتطاع ‪.trunc‬‬ ‫•‬
‫لذلك ‪ ،‬سيتم اقتطاع امللف املسمى ‪ scratchpad‬في املجلد الحالي‪.‬‬ ‫•‬
‫عندما نفتح امللف املسمى ‪ ، precious‬نطلب وضع اإللحاق‪.‬‬ ‫•‬
‫ستستمر أي بيانات في امللف ‪ ،‬وتتم جميع عمليات الكتابة في آخر امللف‪.‬‬ ‫•‬

‫ملحوظة‬

‫في أي وقت يتم استدعاء الفتح ‪ ،‬يتم ضبط وضع امللف ‪ ،‬سواء بشكل رصيح أو ضمين‪.‬‬ ‫•‬
‫وعندما ال يتم تحديد وضع ‪ ،‬يتم استخدام قيمة افرتاضية‪.‬‬ ‫•‬

‫قسم التمارين ‪8.2.2‬‬

‫التمرين ‪:8.7‬‬
‫‪ -‬قم بمراجعة برنامج متجر الكتب من القسم السابق لكتابة مخرجاته في ملف‪.‬‬
‫‪ -‬قم بتمرير اسم هذا امللف كوسيطة ثانية إلى ‪.main‬‬

‫التمرين ‪:8.8‬‬
‫‪ -‬قم بمراجعة الربنامج من التمرين السابق إللحاق مخرجاته بامللف املحدد‪.‬‬
‫‪ -‬قم بتشغيل الربنامج على نفس ملف املخرجات مرتني على األقل لضمان االحتفاظ بالبيانات‪.‬‬
‫‪ . 8٫1‬قنــــــــــوات الـسلــــــــــسلــــــــــة‬
‫‪8.3. string Streams‬‬

‫يعرف العنوان ‪ sstream‬ثالثة أنواع لدعم املدخالت واملخرجات في الذاكرة ؛‬


‫ّ‬
‫تقرأ هذه األنواع من سلسلة أو تكتب عليها كما لو كانت قناة مدخالت ومخرجات‪.‬‬ ‫•‬
‫يدعم نوع قناة مدخالت السلسلة ‪ istringstream‬القراءة من سلسلة ‪،‬‬ ‫•‬
‫ويدعم نوع قناة مخرجات السلسلة ‪ ostringstream‬الكتابة على سلسلة ‪،‬‬ ‫•‬
‫أما نوع قناة السلسلة ‪ stringstream‬فيدعم قراءة وكتابة سلسلة‪.‬‬ ‫•‬
‫املعرفة في ‪ sstream‬من األنواع اليت استخدمناها من عنوان قناة املدخالت‬
‫ّ‬ ‫ومثل أنواع قناة امللفات ‪ ،‬ترث األنواع‬
‫واملخرجات ‪.iostream‬‬
‫املعرفة في ‪ sstream‬أعضاء إلدارة السلسلة املرتبطة بالقناة‪.‬‬
‫ّ‬ ‫إضافة إلى عمليات ترثها ‪ ،‬تضيف األنواع‬ ‫•‬
‫يتم رسد تلك العمليات في الجدول ‪.8.5‬‬ ‫•‬
‫قد يتم استدعاء تلك العمليات على كائنات قنوات سلسلة لكن ليس على أنواع مدخالت ومخرجات أخرى‪.‬‬ ‫•‬

‫معرفة سلسلة‬
‫الجدول ‪ .8.5‬عمليات ّ‬

‫الحظ أنه على الرغم من أن قناة امللفات ‪ fstream‬وقناة السلسلة ‪ sstream‬يشرتكان في الواجهة مع‬ ‫•‬
‫قناة املدخالت واملخرجات ‪ ، iostream‬إال أنهما ال يوجد بينهما عالقة متبادلة أخرى‪.‬‬
‫وتحديداً ‪ ،‬ال يمكننا استخدام ‪ open‬و ‪ close‬على قناة السلسلة ‪، stringstream‬‬ ‫•‬
‫كما ال يمكننا استخدام ‪ str‬على قناة امللفات‪.‬‬ ‫•‬

‫‪8.3.1. Using an istringstream‬‬ ‫‪ 8٫3٫1‬استخدام قناة مدخالت السلسلة‬

‫غالبا ما يتم استخدام قناة مدخالت السلسلة عندما يكون لدينا بعض األعمال اليت يجب القيام بها على سطر كامل ‪،‬‬
‫ً‬
‫وأعمال أخرى تتعلق بكلمات فردية داخل السطر‪.‬‬
‫• كمثال ‪ ،‬افرتض أن لدينا مل ًفا يرسد أسماء األشخاص وأرقام هواتفهم املرتبطة‪.‬‬
‫رقما واح ًدا فقط ‪ ،‬بينما يمتلك آخرون عدة أرقام كهاتف املزنل وهاتف العمل ورقم‬
‫• يمتلك بعض األشخاص ً‬
‫الجوال وما إلى ذلك‪.‬‬
‫• قد يبدو ملف مدخالتنا كما يلي ‪:‬‬

‫‪morgan‬‬ ‫‪2015552368‬‬ ‫‪8625550123‬‬


‫‪drew‬‬ ‫‪9735550130‬‬
‫‪lee‬‬ ‫‪6095550132‬‬ ‫‪2015550175‬‬ ‫‪8005550000‬‬
‫يبدأ كل سجل في هذا امللف باسم يتبعه رقم هاتف واحد أو أكرث‪.‬‬ ‫•‬
‫سنبدأ بتعريف فئة بسيطة لتمثيل بيانات مدخالتنا‪:‬‬ ‫•‬

‫‪// members are public by default; see § 7.2‬‬


‫{ ‪struct PersonInfo‬‬
‫;‪    string name‬‬
‫;‪    vector<string> phones‬‬
‫;}‬

‫سيكون لكائنات من نوع ‪ PersonInfo‬عضو يمثل اسم الشخص ومتجه يحمل عد ًدا متغريًا من أرقام‬ ‫•‬
‫هواتفه املرتبطة‪.‬‬
‫سيقوم برنامجنا بقراءة ملف البيانات وإنشاء متجه لـ ‪.PersonInfo‬‬ ‫•‬
‫سيتوافق كل عنرص في املتجه مع سجل واحد في امللف‪.‬‬ ‫•‬
‫وسنعالج املدخالت في حلقة تقرأ سجاًل ثم نستخرج االسم وأرقام الهواتف لكل شخص ‪:‬‬ ‫•‬

‫;‪string line, word‬‬ ‫‪// will hold a line and word from input, respectively‬‬
‫‪vector<PersonInfo> people; // will hold all the records from input‬‬
‫)‪// read input line at time until cin hits end-of-file (or another error‬‬
‫{ ))‪while (getline(cin, line‬‬
‫;‪    PersonInfo info‬‬ ‫‪// create an object to hold this record's data‬‬
‫;)‪    istringstream record(line‬‬ ‫‪// bind record to the line we just read‬‬
‫;‪    record >> info.name‬‬ ‫‪// read the name‬‬
‫)‪    while (record >> word‬‬ ‫‪// read the phone numbers‬‬
‫;)‪        info.phones.push_back(word‬‬ ‫‪// and store them‬‬
‫‪    people.push_back(info); // append this record to people‬‬
‫}‬

‫هنا نستخدم ‪ getline‬لقراءة سجل كامل من املدخالت القياسية‪.‬‬ ‫•‬


‫إذا نجح استدعاء ‪ ، getline‬فسيحتفظ السطر بسجل من ملف املدخالت‪.‬‬ ‫•‬
‫نعرف كائن ‪ PersonInfo‬محلي لالحتفاظ بالبيانات من السجل الحالي‪.‬‬
‫في الداخل ‪ّ ،‬‬ ‫•‬
‫بعد ذلك ‪ ،‬نربط قناة سلسلة بالسطر الذي قرأناه للتو‪.‬‬ ‫•‬
‫يمكننا اآلن استخدام عامل املدخالت في قناة مدخالت السلسلة هذه لقراءة كل عنرص في السجل الحالي‪.‬‬ ‫•‬
‫متبوعا بحلقة ‪ while‬اليت ستقرأ أرقام هواتف ذلك الشخص‪.‬‬
‫ً‬ ‫قرأنا أوال ً االسم‬ ‫•‬
‫تنتهي ‪ while‬الداخلية عندما نقرأ جميع البيانات في السطر‪.‬‬ ‫•‬
‫تعمل هذه الحلقة بشكل مشابه ألخرى كتبناها لقراءة ‪.cin‬‬ ‫•‬
‫الفرق هو أن هذه الحلقة تقرأ البيانات من سلسلة بدال ً من املدخالت القياسية‪.‬‬ ‫•‬
‫عندما تتم قراءة السلسلة بالكامل ‪ ،‬ستشري إلى مصادفة "نهاية ملف" ‪،‬‬ ‫•‬
‫وستفشل عملية املدخالت التالية في السجل‪.‬‬ ‫•‬
‫ننهي حلقة ‪ while‬الخارجية من خالل إلحاق ‪ PersonInfo‬الذي عالجناه للتو باملتجه‪.‬‬ ‫•‬
‫تستمر ‪ while‬الخارجية حىت نصادف نهاية امللف في ‪.cin‬‬ ‫•‬
‫قسم التمارين ‪8.3.1‬‬

‫التمرين ‪:8.9‬‬
‫‪ -‬استخدم الدالة اليت كتبتها للتمرين األول في الفقرة ‪ 8.1.2‬لطباعة محتويات كائن قناة مدخالت السلسلة‪.‬‬

‫التمرين ‪:8.10‬‬
‫برنامجا لتخزين كل سطر من ملف في متجه <‪.>string‬‬‫ً‬ ‫‪ -‬اكتب‬
‫‪ -‬استخدم اآلن قناة مدخالت السلسلة لقراءة كل عنرص من املتجه لكلمة في وقت واحد‪.‬‬

‫التمرين ‪:8.11‬‬
‫‪ -‬حدد الربنامج في هذا القسم كائن قناة مدخالت السلسلة داخل حلقة ‪ while‬الخارجية‪.‬‬
‫‪ -‬ما هي التغيريات اليت ستحتاج إلى إجرائها إذا تم تعريف السجل خارج تلك الحلقة؟‬
‫‪ -‬أعد كتابة الربنامج ‪ ،‬وانقل تعريف السجل إلى خارج ‪، while‬‬
‫‪ -‬وانظر ما إذا كنت قد فكرت في جميع التغيريات املطلوبة‪.‬‬

‫التمرين ‪:8.12‬‬
‫‪ -‬ملاذا لم نستخدم مهيئات داخل الفئة في ‪PersonInfo‬؟‬

‫‪8.3.2. Using ostringstreams‬‬ ‫‪ 8٫3٫2‬استخدام قنوات مخرجات السلسلة‬

‫تكون قناة مخرجات السلسلة مفيدة عندما نحتاج إلى زيادة مخرجاتنا قليالً كل مرة ولكن ال نريد طباعة املخرجات‬
‫حىت وقت الحق‪.‬‬
‫• مثالً ‪ ،‬قد نرغب في التحقق من صحة أرقام الهواتف اليت قرأناها في املثال السابق وإعادة تنسيقها‪.‬‬
‫• إذا كانت جميع األرقام صحيحة ‪ ،‬فنحن نريد طباعة ملف جديد يحتوي على األرقام اليت تمت إعادة‬
‫تنسيقها‪.‬‬
‫• إذا كان لدى أي شخص أي أرقام غري صالحة ‪ ،‬فلن نضعها في امللف الجديد‪.‬‬
‫بدال ً من ذلك ‪ ،‬سنكتب رسالة خطأ تحتوي على اسم الشخص وقائمة بأرقامه غري الصالحة‪.‬‬ ‫•‬
‫ونظرًا ألننا ال نريد تضمني أي بيانات لشخص لديه رقم غري صالح ‪،‬‬ ‫•‬
‫فال يمكننا طباعة مخرجات حىت نرى جميع أرقامهم ونتحقق من صحتها‪.‬‬ ‫•‬
‫ومع ذلك ‪ ،‬يمكننا "كتابة" املخرجات إلى قناة مخرجات السلسلة في الذاكرة ‪:‬‬ ‫•‬

‫{ )‪for (const auto &entry : people‬‬ ‫‪// for each entry in people‬‬
‫‪    ostringstream formatted, badNums; // objects created on each loop‬‬
‫‪    for (const auto &nums : entry.phones) { // for each number‬‬
‫{ ))‪        if (!valid(nums‬‬
‫;‪            badNums << " " << nums‬‬ ‫‪// string in badNums‬‬
‫‪        } else‬‬
‫‪            formatted << " " << format(nums); // “writes” to formatted's string‬‬
‫}‪    ‬‬
‫))(‪    if (badNums.str().empty‬‬ ‫‪// there were no bad numbers‬‬
‫" " << ‪        os << entry.name‬‬ ‫‪// print the name‬‬
‫‪<< formatted.str() << endl; // and reformatted numbers‬‬
‫‪    else‬‬ ‫‪// otherwise, print the name and bad numbers‬‬
‫‪        cerr << "input error: " << entry.name‬‬
‫;‪<< " invalid number(s) " << badNums.str() << endl‬‬
‫}‬

‫في هذا الربنامج ‪ ،‬افرتضنا دالتني ‪ valid ،‬و ‪ ، format‬للتحقق من صحة أرقام الهواتف وإعادة‬ ‫•‬
‫تنسيقها ‪ ،‬على التوالي‪.‬‬
‫الجزء املثري لالهتمام من الربنامج هو استخدام قنوات السلسلة لـ ‪ formatted‬و ‪.badNums‬‬ ‫•‬
‫نستخدم عامل مخرجات عادي (<<) للكتابة على هذه الكائنات‪.‬‬ ‫•‬
‫لكن ‪ ،‬هذه "الكتابة" هي في الحقيقة معالجة سلسلة‪.‬‬ ‫•‬
‫إنها تضيف أحر ًفا إلى السالسل داخل ‪ formatted‬و ‪ ، badNums‬على التوالي‪.‬‬ ‫•‬

‫قسم التمارين ‪8.3.2‬‬

‫التمرين ‪:8.13‬‬
‫‪ -‬أعد كتابة برنامج رقم الهاتف من هذا القسم للقراءة من ملف مسمى وليس من ‪.cin‬‬

‫التمرين ‪:8.14‬‬
‫‪ -‬ملاذا تم الترصيح عن املدخالت واألرقام على أنها ‪& const auto‬؟‬
‫ملخــــــــــص الفصــــــــــل‬
‫‪Chapter Summary‬‬

‫يستخدم يس‪ ++‬فئات املكتبة للتعامل مع املدخالت واملخرجات املوجهة نحو القناة ‪:‬‬
‫تتعامل فئات ‪( iostream‬قناة املدخالت واملخرجات) مع املدخالت واملخرجات لوحدة التحكم‬ ‫•‬
‫تتعامل فئات ‪( fstream‬قناة امللفات) مع املدخالت ‪ /‬املخرجات للملفات املسماة‬ ‫•‬
‫تقوم فئات ‪( Stringstream‬قناة السلسلة) بمدخالت ومخرجات إلى سالسل في الذاكرة‬ ‫•‬

‫ترتبط فئات قناة امللفات و قناة السلسلة بالوراثة إلى فئات قناة املدخالت واملخرجات‪.‬‬
‫ترث فئات املدخالت من قناة املدخالت وفئات املخرجات من قناة املخرجات‪.‬‬ ‫•‬
‫أيض ا إجراء عمليات يمكن إجراؤها على كائن قناة املدخالت إما على قناة مدخالت ملفات أو‬
‫وبالتالي ‪ ،‬يمكن ً‬ ‫•‬
‫قناة مدخالت سلسلة‪.‬‬
‫وباملثل ينطبق اﻷمر نفسه بالنسبة لفئات املخرجات ‪ ،‬اليت ترث من قناة املخرجات‪.‬‬ ‫•‬

‫يحتفظ كل كائن مدخالت ومخرجات بمجموعة من الحاالت اليت تشري إلى ما إذا كان يمكن إجراء مدخالت أو‬
‫مخرجات من خالل هذا الكائن‪.‬‬
‫ٍ‬
‫عندئذ ستكون حالة الكائن في خطأ‬ ‫• ففي حالة مواجهة خطأ ‪ -‬مثل مصادفة نهاية ملف في قناة املدخالت ‪-‬‬
‫بحيث ال يمكن إجراء أي مدخالت أخرى حىت يتم تصحيح الخطأ‪.‬‬
‫• توفر املكتبة مجموعة من الدوال لتعيني واختبار تلك الحاالت‪.‬‬
‫مصطلحــــــــــات معــــــــــرفة‬
‫‪Defined Terms‬‬

‫حالة الرشط ‪ :‬عالمات ودوال مرتبطة بتلك العالمات قابلة لالستخدام من قبل أي من فئات القناة اليت‬
‫‪condition state‬‬
‫تشري إلى ما إذا كانت قناة معينة قابلة لالستخدام‪.‬‬

‫وضع امللف ‪ :‬عالمات محددة بواسطة فئات قناة ملفات يتم تحديدها عند فتح ملف والتحكم في‬
‫‪file mode‬‬
‫كيفية استخدامه‪.‬‬

‫قناة ملفات ‪ :‬كائن قناة يقرأ أو يكتب مل ًفا مسمى‪.‬‬


‫تعرف قنوات امللفات األعضاء فتح_ وإغالق_‪.‬‬‫وإضافة لعمليات قناة املدخالت واملخرجات العادية ‪ّ ،‬‬
‫‪file stream‬‬ ‫يأخذ العضو فتح_ سلسلة أو سلسلة أحرف على نمط ‪ C‬تقوم باستدعاء امللف املراد فتحه ووسيطة‬
‫اختيارية لوضع الفتح‪.‬‬
‫يغلق العضو إغالق_ امللف الذي تم إرفاق القناة به‪ .‬ويجب استدعائه قبل فتح ملف آخر‪.‬‬

‫قناة_ملفات‪ :‬قناة ملف يقرأ ويكتب في نفس امللف‪.‬‬


‫‪fstream‬‬
‫افرتاضياً ‪ ،‬يتم فتح قنوات امللفات بتحديد الوضعان ‪ in‬و‪.out‬‬

‫قناة_مدخالت_ملفات ‪ :‬قناة ملف يقرأ ملف مدخالت‪.‬‬


‫‪ifstream‬‬
‫افرتاضياً ‪ ،‬يتم فتح قنوات مدخالت امللفات بتحديد الوضع ‪.in‬‬

‫وراثة ‪ :‬مزية برمجة تتيح للنوع أن يرث واجهة من نوع آخر‪.‬‬


‫ترث فئتا قناة مدخالت امللفات و قناة مدخالت السلسلة من قناة املدخالت‪،‬‬
‫‪inheritance‬‬
‫وترث فئات قناة مخرجات امللفات و قناة مخرجات السلسلة من قناة املخرجات‪.‬‬
‫يغطي الفصل ‪ 15‬الوراثة‪.‬‬

‫‪istringstream‬‬ ‫قناة_مدخالت_سلسلة ‪ :‬قناة سلسلة تقرأ سلسلة معينة‪.‬‬

‫قناة_مخرجات_ملفات ‪ :‬قناة ملف تكتب إلى ملف مخرجات‪.‬‬


‫‪ofstream‬‬
‫افرتاضياً ‪ ،‬يتم فتح قنوات مخرجات امللفات بتحديد وضع ‪.out‬‬
‫‪ostringstream‬‬ ‫قناة_مخرجات_سلسلة ‪ :‬قناة سلسلة تكتب إلى سلسلة معينة‪.‬‬

‫قناة سلسلة‪ :‬قناة كائن تقرأ أو تكتب سلسلة‪.‬‬


‫تعرف قنوات السلسلة العضو زائد التعبئة ‪.str‬‬‫إضافة لعمليات قناة املدخالت واملخرجات العادية ‪ّ ،‬‬
‫‪string stream‬‬
‫يؤدي استدعاء ‪ str‬بدون وسيطات إلى إعادة سلسلة يتم إرفاق سلسلة القناة بها‪.‬‬
‫و يؤدي استدعائها بسلسلة إلى إرفاق قناة السلسلة بنسخة من تلك السلسلة‪.‬‬

‫‪stringstream‬‬ ‫قناة_سلسلة‪ :‬قناة سلسلة تقرأ وتكتب إلى سلسلة معينة‪.‬‬

You might also like