التدفقات والملفات في ++C

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

فئات التدفقات

المصطلح " تدفق stream " مصطلح عام , يقصد به سريان البيان , ويقصد به في السي++ كائن ينتمي إلي فئة معينة وقد تداولنا إلي الأن مع التدفقين cin و cout . ولكن هناك تدفقات أخري أشهرها ما يتعلق بالتعامل مع الأقراص . وتستخدم تدفقات مختلفة للتعبير عن طرق مختلفة من سريان البيانات . فمثلا ؛ تمثل الفئة ifstream ملفات مدخلة للأقراص .

مزايا التدفقات

ربما يتساءل مبرمجو السي++ عن مزايا فئات التدفقات الخاصة بالإخراج والإدخال , بالنسبة للدوال التقليدية مثل printtf(), fscanf(), fprintf(), fscanf() , وغيرها .

السبب الأول هو التبسيط ولو تصادف واستخدمت محرف التهيئة d % بدلا من f % في الطرق التقليدية لأمكنك تقدير هذه الميزة فليس في التدفقات مثل هذه العمليات الخاصة بالتهيئة , حيث يعرف كل كائن كيف يظهر نفسه ولعلك تدرك بنفسك كم الأخطاء التي يتلافاها هذا الأسلوب .

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

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

تدرج فئات التدفقات

فئات التدفقات مرتبة في تشكيل غريب شيئا ما , ويوضح الشكل تنظيم أغلبها .

c  5

شكل تدرج فئات أهم التدفقات

وقد استخدمنا للأن بعضا من هذه التدفقات ؛ فمؤثر الاستخلاص >> عنصر في الفئة istream ومؤثر الإيلاج << عنصر في الفئة ostream وكلا الفئتين مشتقتان من الفئة iostream والكائن cout المسئولة عن الإظهار للشاشة معرف ككائن منتم الفئة ostream_withassign المشتقة من الفئة ostream وبالمثل ينتمي الكائن cin المسئول عن الإدخال من لوحة المفاتيح ينتمي للفئة istream_withassign المشتقة من الفئة istream .

والفئات الخاصة بالإدخال من لوحة المفاتيح والإخراج للشاشة متضمنان في الملف التصديري iostream.h أما الفئات المختلفة بالتعامل مع الأقراص فمعرفة في الملف التصديري fstream.h . ويبين الشكل أي من الفئات في كلا الملفين التصديريين . ولعلك تجد من الملائم دراسة العلاقات بين الفئات بطباعة الملفين , وتجدهما في الدليل الفرعي include . فالكثير من الأسئلة المتعلقة بالتدفقات يمكن الحصول علي الإجابة عنها بدراسة فئاتها والثوابت التي يعلن عنها .

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

والفئتان ostream, istream مشتقتان من الفئة الأساسية iostream ومكرستان لعمليات الإدخال والإخراج , وتحتوي الفئة istream علي دوال مثل get(), getline(), read() والمؤثر << مزاد التحميل , بينما تحتوي الفئة ostream علي دوال مثل put(), write() والمؤثر >> مزاد التحميل .

وتشتق الفئة iostream من كل من الفئتين istream, ostream عن طريق التوارث المتضاعف . والفئات المشتقة منها يمكن استخدامها في التعامل مع الأجهزة كملفات الأقراص التي تفتح للكتابة والقراءة في نفس الوقت والفئات الثلاث istream_withhassegn, ostram_withassign, iostream_withassign مشتقة من الفئات istream, ostream, iostream علي الترتيب وهي تضيف مؤثرات تخصيص لهذه الفئات , بحيث يمكن لكل من cin, cout أن يخصص لها تدفقات أخري , وسوف نعرف معني هذا عندما نتحدث عن تحويل الاتجاه .

وسوف نقدم لك عرضا سريعا لهذه الفئات , قد تمر عليها مر الكرام الأن , وترجع إليها حينما تصادف موقفا يتطلب التعامل مع التدفقات .

الفئة ios

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

رايات التهيئة

رايات التهيئة هي مجموعة من التعاريف في الفئة ios تعمل كل واحدة كتحويلة بين وضعين , كما هو موضح في الجدول الذي يضم حصرا بها .

جدول رايات التهيئة :

الراية

المعني

Skipws

تجاهل المسافات البيضاء عند الإدخال

left

محاذاة الخرج إلي اليسار

Right

محاذاة الخرج إلي اليمين

Internal

إدخال حشو للمحافظة علي مسافة الحقول

dec

تحويل للنظام العشري

Oct

تحويل للنظام الثماني

hex

تحويل للنظام السداسي عشر

Showbase

اظهر قاعدة النظام الرقمي (o للنظام الثماني و ox للنظام السداسي عشر )

Showpoint

اظهر العلامة العشرية

Uppercase

استخدم الحروف الكبيرة ABC

showpos

اظهر + قبل الأعداد الموجبة

Scientific

استخدم النظام العلمي للأرقام

fixed

عدد الأعداد الكسرية ثابت

Unitbuf

افرغ الذاكرة المرحلية بعد الانتهاء

stdio

افرغ stdout, stderror بعد الانتهاء

وقد مر بنا بعض هذه الرايات , والباقي واضح الأثر من اسمه . وحيث إنها عناصر للفئة ios فيجب أن تنسب إليها عن طريق مؤثر النطاق , مثلا ios::skipws وجميعها يمكن أن يوضع في الوضع الفعال أو غير الفعال عن طريق الدالتين setf(), unsetf() علي الترتيب وهي دوال الفئة ios فعلي سبيل المثال :

Cout.setf(ios::left);

Cout << ''this text is left justified'';

Cout.unsetf(ios::left);

وقد تستخدم بعض الدوال المتحكمة في تشغيل الرايات وهو ما سنتناوله الأن .

الدوال المتحكمة manipulators

الدوال المتحكمة هي أوامر تدمج مباشرة في التدفق , وقد رأينا بعضا منها , أشهرها بالطبع الدالة المتحكمة endl . كما استخدمنا في البرنامج salemon الدالة المتحكمة endl كما استخدمنا في البرنامج salemon.cpp الدالة المتحكمة setiosflag(ios::fixed) . ومن ذلك نري أن هذه الدوال تقع في مجموعتين , التي لا تأخذ معاملا , والتي تأخذ معاملا . ويبين الجدول المجموعة الأولي .

جدول المتحكمات دون معامل

المتحكمة

الغرض منها

Ws

أدخل المسافات البيضاء

Des

حول للنظام العشري

Oct

حول للنظام الثماني

Hex

حول للنظام السداسي عشر

Endl

نهاية السطر

Ends

نهاية عبارة نصية , أدخل المحرف الصفري

Flush

أفرغ التدفق الخارج

Lock

ثبت مميز الملف lock file handle

Unlock

حرر مميز الملف

و بإمكانك إدخال الدوال مباشرة في سطر كالتالي :

Cout << hex << var;

فيخرج الرقم علي الصورة السداسية عشرية .

ويبين جدول المتحكمات التي تحتاج لمعامل , واستخدامها يتطلب تضمين الملف iomanip.h .

جدول المتحكمات ذات العامل

المتحكمة

المعامل

تأثيرها

Set()

Field width(int)

إنشاء حقل بمسافة محددة بالمعامل

Setprecision()

Precision(int)

تحديد عدد الخانات العشرية (درجة الدقة)

Setiosflag()

Flag(long)

تشغيل راية

Resetioflag()

Flag(log)

إلغاء تشغيل راية

التسميات: