تيارات الإدخال و الإخراج في لغة ++C

ما بين حركة أناملك على لوحة المفاتيح و ظهور تلك الأحرف على شاشة حاسبك أسرار برمجية، لكل شخص مطلق الحرية فيما تُدخله أناملُه كما أنه ليس من المستحيل بالنسبة لك تغييره قبل الوصول إلى شاشة حاسبك، لهذا الأمر علوم سنمر على أساسياتها معاً في هذه التدوينة.

2577.Stream[1]البرامج المنشأة بإستخدام ++C تُنجز عمليات الإدخال والإخراج على شكل تيارات من الحروف أو البايتات (Bytes). التيار هو سلسلة من البايتات التي يمكن أن تتجه من البرنامج إلى وحدة الإخراج الأساسية (الشاشة)، أو تتجه من وحدة الإدخال الأساسية (لوحة المفاتيح) إلى البرنامج. وبصفة عامة، يمكن أن تكون مدخلات البرامج عن طريق لوحة المفاتيح، ملف، ماسح، أو أي أداة إدخال أخرى. ويمكن أن تكون مخرجات البرامج متجهه إلى شاشة، ملف، طابعة، أو أي أداة أخراج أخرى.

توجد ثلاثة تيارات أساسية تُفتح تلقائياً للبرنامج عند تنفيذ البرنامج وهي: cin، cout، و cerr:

  • تُمثِل cin وحدة الإدخال الأساسية.
  • cout تمثل وحدة الإخراج الأساسية.
  • cerr تمثل وحدة إخراج الأخطاء الأساسية.

والخيار الافتراضي لوحدتي الإدخال و الإخراج الأساسيتين هما لوحة المفاتيح و الشاشة، على التوالي. أي أن cin تستقبل من لوحة المفاتيح، بينما cout و cerr تُخرجان نحو الشاشة.

بهذا التمثيل فإن البرامج تتعامل مع هذه التيارات بدلاً من وحدات الإدخال و الإخراج الفيزيائية (لوحة المفاتيح و الشاشة). و يمكن كذلك تغيير الخيار الافتراضي بحيث يكون مثلاً cout ممثلاً للطابعة بدلا من الشاشة وهكذا.
وحتى يمكن استخدام التيارات، لا بد من إضافة ملف الرأس iostream إلى الملف المصدر لاحتوائه على تعاريف التيارات. وبالتحديد، فإن تياري cin و cout عبارة عن كائنين من صنفي: istream و ostream. و يوجد في ملف الرأس iostream إعلانات تبدو كما يلي:

istream cin;
ostream cout;

حيث يُخبر الإعلان الأول أن cin كائن من صنف istream، بينما يخبر الإعلان الثاني أن cout كائن من صنف ostream. وتنطق istream بـ “input stream” أي أن الحرف i هو اختصار input.

يمكنك ملاحظة أن المصطلح “كائن” يعني هنا متغيراً من صنف خاص. فكما تقول في الإعلان التالي:

int x;

أن المتغير x من نوع int، يمكنك القول: ” أن الكائن x من الصنف int ” وهكذا. والمتغيرات و الكائنات عبارة عن أسماء لمواقع في ذاكرة الجهاز.

عادةً، cin تخزن المدخلات في موقع تخزين مؤقت Buffer يستخدم كمرحلة وسيطة بين جهاز الدخل البطئ “لوحة المفاتيح” والبرنامج الذي يعمل بسرعة عالية. وهذا صحيح أيضا بالنسبة لكائن تيار الإخراج cout. ففي بعض الأنظمة، تخزن مخرجات البرنامج في موقع تخزين مؤقت Buffer ولا يتم عرض هذا المخرجات على الشاشة إلا بعد فراغ هذا الموقع المؤقت من محتوياته. و يحدث التفريغ flush إذا كانت كمية المخرجات جديرة للعرض على الشاشة. ونظرا لتمثيل cin للوحة المفاتيح و cout للشاشة وإمكانية التخزين المؤقت للمدخلات والمخرجات فإن البرامج في حالات الإدخال و الإخراج ستتعامل مع هذين الممثلين cin و cout بدلاً من لوحة المفاتيح البطيئة والشاشة، وبالتالي سيؤدي ذلك إلى تحسن كفاءة النظام.
وقد تحدثنا في البنود السابقة عن صيغ تياري الإدخال cin و الإخراج cout، وفيما يلي سوف نقدم بعض الخيارات الإضافية لهما.

تيار الإخراج Output Stream

سأقتصر في الحديث هنا عن تيار الإخراج cout والمتجه للشاشة. وفيه يُستخدم المعامِل << لإدراج تعبير معين في تيار الإخراج cout الممثل للشاشة، لذا سمي << بمعامل الإدراج. وفي أبسط إستخداماته، يوضع المعامل << بين تيار الإخراج cout و التعبير المراد طباعة قيمته. مثلاً العبارات التالية تؤدي إلى طباعة التعابير التي تلي معامل الإخراج، سواء كانت ثابتة أو متغيرة، على الشاشة:

int number = 27;
cout << number;

cout << " Mudawna Oolom ";
cout << 100;

لاحظ أن سلسلة الحروف Mudawna Oolom محصورة بين علامتي التنصيص المزدوجة لكونها سلسلة حروف ثابتة، وذلك من أجل تمييزها عن المتغيرات بوضوح. فمثلا العبارتين التاليتين مختلفتين تماماً:

cout << number;
cout << "number";

ويمكن أيضاً طباعة أكثر من عنصر بإستخدام عبارة إخراج واحدة فقط. فمثلا في برنامج (1-3)، السطران 15 و 16 أُستخدما لطباعة مربع الرقم، كالتالي:

cout << "The Square is ";
cout << square; // display the square

هاتان العباراتان بالإمكان دمجهما بعبارة واحدة كتالي:

cout << "The Square is " << square;

هذه الطريقة تستخدم عاملي إدراج في نفس عبارة cout. العامل الأول يدرج “The Square is“، أما العامل الثاني فيدرج قيمة المتغير square، لاحظ أن مخرجات العبارة السابقة مختلفة النوع. وبصفة عامة، في عبارة الإخراج الواحدة يمكنك وضع معامل الإدراج << بشكل تسلسلي وبعدد العناصر التي تريد إدراجها في تيار الإخراج. وهذه الطريقة مفيدة عندما تكون المخرجات مجموعة مؤلفة من متغيرات و ثوابت أو أكثر من متغير. مثلاً لنفرض أن المتغير number يحتوي على الرقم 4 والمتغير square يحتوي على 16 فإن العبارة التالية:

cout << "The square of " << number << " is " << square;

تؤدي إلى طباعة المخرجات التالية على الشاشة:

The square of 4 is 16

ومن المهم ملاحظة أن عبارة cout لا تضيف سطراً جديداً إلى مخرجاتها إلا إذا أضافهُ المبرمج في العبارة. لنتمثل مخرجات العبارتين التاليتين:

cout << "Mudawna Oolom";
cout << "welcome.";

ستظهر على نفس السطر كالتالي:

Mudawna Oolom welcome.

لاحظ أيضاً عدم وجود فراغ بين الكلمتين: welcome و Oolom لعدم وجوده بعد نهاية العبارة الأولى ولا في بداية العبارة الثانية، أي أن النصوص تطبع تماماً بالصورة التي تبدو فيها للعيان وهي محصورة بين علامتي الإقتباس، بإستثناء بعض الحروف الخاصة والتي تبدأ بالخط المائل (\) والمسمى حرف الخروج. يتبع حرف الخروج (\) حرف أو أكثر لتشكيل تتابع من الحروف تسمى بتتابع الخروج Escape Sequences وهي شيفرة تستخدم لترميز حروف خاصة. يمكن إدراج سطر جديد باستخدام تتابع الخروج n\ الذي يرمز لسطر جديد، ويؤدي إلى تحرك مؤشر الشاشة إلى بداية السطر التالي.

وللتوضيح فإن العبارتان:

cout << " Mudawna \n";
cout << " Oolom \nwelcome.";

تؤديان إلى ظهور المخرجات التالية على الشاشة:

Mudawna

Oolom

welcome

كذلك، يمكننا إدراج سطر جديد باستخدام endl (اختصار “end line”) وهو نوع خاص من الإجراءات يسمى بمعالج التيار stream manipulator وموجود في الفضاء std. ولذا يمكنك إضافة سطر جديد باستخدام تتابع الخروج n\ أو المعالج endl. ولكن هناك إختلاف بسيط بينهما، فالمعالج endl يقوم بسلوك إضافي عندما يستخدم مع تيارات الإخراج التي تستخدم مواقع مؤقتة للتخزين Buffer، حيث يضيف السطر الجديد ثم يُفرغ الذاكرة المؤقتة لتيار الإخراج.

لتوضيح صيغة استخدام المعالج endl، فإن العبارتان:

cout << " Mudawna"<<endl;
cout << "Oolom "<<endl<<"welcome.";

تؤديان إلى ظهور المخرجات التالية:

Mudawna
Oolom
welcome.

لاحظ أن المعالج endl يجب أن يستخدم منفرداً بعد معامل الإدراج <<.

 

تيار الإدخال Input Stream

المعامل >> يستخلص قيماً من تيار الإدخال ويخزنها في المتغيرات التي تليه. وهنا أوضح لك بعض الصور التي يمكن إستخدامها مع تيار الإدخال cin المرتبط مع لوحة المفاتيح.
كما ذكرتُ لك سابقاً، يستخدم معامل الإستخلاص >> مع تيار الإدخال cin من أجل إستخلاص القيم المطلوبة وتخزينها في المتغيرات التي تليه.إقرأ العبارتان:

int x;
cin >> x;

تعرّف العبارة الأولى المتغير x كمتغير من نوع int، أما العبارة الثانية فتؤدي إلى توقف الحاسب منتظراً قيمة من لوحة المفاتيح من أجل تخزينها في المتغير x. وعندما يحدد المستخدم القيمة فإن الحاسب لا يعالجها إلا بعد الضغط على مفتاح الإدخال Enter أو يصل إلى عبارة Return، عندها يتم استقبال القيمة ومعالجتها ثم تخزينها في المتغير x.
إدخال البيانات إلى البرنامج من قِبل المستخدم قد يتسبب في حدوث أخطاء منطقية للبرنامج. فإذا طلب البرنامج قيمة عدد صحيح على سبيل المثال، فعلى المستخدم التقيد بإدخال هذا النوع وإلا قد يحصل على نتائج غير صحيحة أو يترتب عليه حدوث أخطاء أثناء التشغيل وبالتالي إيقاف تنفيذ البرنامج من قِبل نظام التشغيل.
بالإمكان أيضاً قراءة أكثر من قيمة بعبارة إدخال واحدة وذلك بوضع معامل الاستخلاص >> بشكل تسلسلي وبعدد القيم التي تريد قراءتها من تيار الإدخال. فمثلا العبارة التالية:

cin >> x >> y;

مكافئة للعبارتين التاليتين:

cin >> x;
cin >> y;

ففي كلا الحالتين يجب أن تدخل قيمتين، واحدة للمتغير x والثانية للمتغير y، مع العلم أن معامِل الاستخلاص يقفز الحروف البيضاء الأمامية، لذا يمكنك إدخال القيمتين معاً بشرط أن تكون مفصولتين بأحد الحروف البيضاء مثل: حرف السطر الجديد newline، حرف الجدولة tab، أو حرف المسافة space.

أصبحت الآن مطلعاً على أساسيات الإدخال و الإخراج في لغة ++C، هل تعتقد أنهُ بإمكانك تحويل المخرجات من cout تذهب إلى لوحة المفاتيح؟ ضع رأيك بالتعليقات.

محمد إبراهيم

محمد ابراهيم مهندس حاسوب سوداني 21 عام مهتم بمجال التكنولوجيا والعالم الرقمي

‫5 تعليقات

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق