الرئيسيةالتسجيلدخول

شاطر | 
 

 شرح اكواد مادة نظم ملفات

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل 
كاتب الموضوعرسالة
golden flower
مشرفة
مشرفة


انثى
عدد الرسائل : 2517
العمر : 28
تاريخ التسجيل : 28/04/2008

مُساهمةموضوع: شرح اكواد مادة نظم ملفات   الجمعة نوفمبر 28, 2008 8:58 pm


ده يا جماعه شرح جميل لماده نظم ملفات نقلته و ان شاء الله تستفيدوا منه


فهم آلية التعامل مع الملفات:
بالتأكيد سمعنا كلنا عن cout هل تعرفونه؟؟؟
نعم بالتأكيد إنه أمر الطباعة وهو موجود في الملف الرأسي iostream.h .
هذا صحيح ما عدا أن cout ليس أمر وكذلك cin
ماذا هما إذاً إن لم يكونا أمرين
في الواقع إنهما قناتين cout هي قناة خرج من البرنامج إلى الشاشة (وبالعمق أكثر إنه كائن من نوع صنف قناة خرج)
يعني هناك صنف class يدل على قنوات الخرج ostream و الكائن cout هو متغير من ذلك النوع أي تستطيع القول تقريبا انه:
C++ كود



ostream cout;
ونسميه تجاوزا أمر طباعة لأنه بالواقع يقوم بعمل الطباعة فهو قناة توصل من البرنامج إلى الشاشة و أي شيء نضعه في تلك القناة سيذهب إلى الشاشة ويظهر فيها
أعتقد أن هذا مفهوم الآن وانك إن لم تكن تعرف هذا من قبل فقد فهمت الآن لماذا هو موجود في الملف الرأسي iostream أي قنوات الدخل والخرج (input output stream)
وأيضا فهمت كيف يمكن أن تجد أوامر من النوع cout.width.
حسنا أعتقد أنه مفهوم الآن لكن ما دخل ذلك بالملفات؟؟
الموضوع(1) :
بالواقع لقد اختارت لغة السي أن تتعامل مع الملفات بنفس الطريقة التي تتعامل بها مع الشاشة والطباعة
أي عبر القنوات فكما أنه عندما نريد طباعة شيء ما نضعه في القناة التي تودي إلى الشاشة أيضا عندما نريد الكتابة في ملف نضع المطلوب في قناة تودي إلى الملفات
القناة التي تودي إلى الشاشة معروفة وهي الـ cout فما هي القناة التي تودي إلى الملف.
حسنا لا توجد قناة جاهزة وإنما يجهزها المبرمج على حسب الملف الذي يريد الوصل معاه
أعجبتني الفكرة حسنا لنبدأ بالتعامل مع القنوات الآن.
لحظة واحدة فقط إذا أحببت أن تتعامل مع قنوات الملفات يجب أن نستخدم الملف الرأسي fstream.h أي قنوات الملفات File Stream
إذا يجب أن تكون العبارة :
C++ كود



#include


موجودة في بداية البرنامج لأن هذا الملف الرأسي يحوي كلاسات جاهزة لقنوات الملفات نستطيع استخدامها منها الكلاس ofstream قناة خرج الملفات (Output File Stream)
بعد أن قمنا بضم الملف الرأسي بقي علينا تجهيز القناة أو متغير من نوع القناة مثل الـ cout يعني. لكن يودي إلى الملف
هذه عملية بسيطة جدا فكل ما هنالك هو تعريف متغير من النوع ofstream كما يلي:
C++ كود



ofstream fout;


هذا الأمر يعرف المتغير fout على انه قناة باتجاه واحد يخرج من البرنامج ويوصل إلى الملف.
هل انتهينا وهل نستطيع استخدام هذه القناة الآن
ليس بعد بقي أمر واحد بسيط جدا.
يجب فتح هذه القناة على ملف معين لأن القرص فيه ملفات كثيرة و يجب ربطها بملف معين أو إنشاء ملف لها
وهذه بسيطة فأمر فتح القناة هو دالة عضو في الكلاس ofstream اسمها open إذا تفتح القناة كما يلي:
C++ كود



fout.open(p1 , p2);


حيث p1 هي اسم الملف مع المسار الكامل له على القرص ويمكن أن يكون ثابت مثلا: "C:\\MyFile.txt" لاحظ استخدام \\ بدلا من \ واحدة لأن الـ \ الواحد لها معنى في السي++
إذا قلنا يمكن أن يكون ثابت أو يكون متغير من النوع النصي يدخله المستخدم.
أما p2 فهي لافتات للقناة أو رايات مثل العلامات التي توضع على الطرق لتدل البيانات المتحركة في تلك القناة.
فما هي هذه الرايات؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
هناك عدة رايات موضح بعضها في الجدول التالي:
الراية - المعنى
ios::in - تعني أن هذه القناة هي من الملف إلى البرنامج يعني تأتي فيها البيانات من الملف إلى البرنامج.
ios:ut - وتعني أن هذه القناة من البرنامج إلى الملف أي قناة للكتابة على الملف.
ios::nocreate - وتعني أن هذه القناة في حال لم يكن الملف موجود على القرص لن تقوم بانشاء ملف جديد.
ios::ate - وتعني أن هذه القناة بعد ان تفتح على الملف ستصب في آخر الملف أي أن أي شيء يدخل فيها سينزل في آخر الملف ولن تنزل فوق البيانات الموجدة في الأول
(أي إذا كان الملف موجودا ويحوي عبارة ما فأي شيء سيمر في هذه القناة سينكتب بعد تلك العبارة وليس فوقها.
ios::app - مشابه لعمل الراية السابقة.
ios::binary - تعني أنها قناة تفتح الملف بالطريقة الثنائية binary (سيتوضح معناها لاحقا عندما نصل إليها)
الآن كانت تلك أهم الرايات. و بعد فتح القناة اصبحت جاهزة للاستخدام تماما كالـ cout لكن بقي شيء واحد أنه بعد الانتهاء من القناة يجب أغلاقها ثانية بالأمر close
عفوا عفوابقي شيء آخر وهو أنه يمكن وضع أكثر من لافتة على الطريق عفوا أقصد أكثر من راية على القناة بواسطة المعامل | كما سيمر لاحقاً
ولنشاهد المثال:
مثال(1) :
تخزين عبارة في ملف
C++ كود



//نربط الملف الرأسي الذي يحوي كلاسات قنوات الملفات
#include
void main()
{
//نعرف متغير قناة خرج out أي للكتابة على الملف
ofstream fout;
//نفتح القناة الآن على ملف محدد باسمه ونضع لافتة على القناة أو راية تدل أنها قناة من البرنامج وتودي للملف
fout.open("D:\\MyFile.txt" , ios:ut);
// الآن جاهزون لاستخدام القناة
fout << "Hello this is my first file test";
//الآن لنغلق القناة
fout.close();
}


الشيفرة السابقة مشروحة فهي تعرف قناة خرج من البرنامج إلى الملف(انا سميتها fout) وانت يمكنك تسميتها على كيفك وتفتحها على ملف اسمه MyFile.txt موجود على القرص D وعلى القناة نضع راية توضح للبيانات أنها قناة تودي إلى القرص وليس العكس.
ثم نضع عبارة hello this is my first file test في تلك القناة.
إفتح جهاز الكمبيوتر لديك الآن وإذهب إلى القرص D لتجد الملف MyFile.txt ينتظرك هناك افتحه وانظر ماذا سترى
هل فعلت ذلك؟؟؟
اكيد وجدت العبارة hello this is my first file test موجودة هناك..... كيف وصلت؟؟؟؟
لقد وصلت عبر القناة من البرنامج.
إذا نلاحظ أن العملية برمتها هي عبارة عن بناء قناة ووضع اللافتات عليها مع فتحها على ملف معين ثم استخدام القناة ببساطة.

سؤال:
طالما عرفنا القناة على انها قناة خرج فلماذا نضع الراية ios:ut لتدل على ذلك و ماذا لو لم نضع رايات هل سيعمل البرنامج يعني جعلنا أمر فتح القناة يحوي فقط اسم الملف أي بالشكل التالي:
C++ كود



fout.open("MyFile.txt");


هل سيعمل البرنامج؟
الجواب نعم سيعمل فالقناة عرفناها أنها قناة إخراج وبالتالي لا داعي للراية هناك لكن لو احببت أن تضعها أو تضع رايات أخرى معها فلا بأس أيضاً

الخلاصة(1) :
للكتابة على ملف
1- نربط الملف الرأسي fstream.h بالبرنامج بعبارة include المعروفة
2- داخل البرنامج نعرف قناة من نوع قناة اخراج للملفات ofstream ونسميها.
C++ كود



ofstream MyStream;


3- نفتح القناة على ملف ما و نضع عليها رايات او لافتات تبين التعامل معها.
C++ كود



MyStream.open( the file full name اسم الملف , the flags الرايات );


4- نرسل المطلوب ارساله للملف مثلما نتعامل مع الامر cout تماماً
5- عند الانتهاء نغلق القناة بالأمر close .

الموضوع(2) :
أنت تستطيع الآن تخزين ما تريده على الملفات في القرص فلماذا لست سعيداً.
هناك شيء ناقص
التعامل مع الملفات ليس فقط في أن اخزن فيها فهناك اشياء أخرى مثلاً القراءة من الملف
حسنا موضوعنا هنا عن القراء من الملف
العملية بسيطة وتشبه إلى حد بعيد عملية التخزين على ملف
من أجل التخزين على ملف عرفنا قناة خرج ملف (Output File STREAM) أي من نوع الكلاس ofstream
إذا من أجل القراءة من الملف سنعرف قناة دخل ملف (Input File Stream) أي من نوع الكلاس ifstream
وأين يوجد هذا الكلاس؟؟
إنه موجود في نفس الملف الرأسي fstream
إذا عملية القراءة من ملف ستكون كما يلي:
1- نربط الملف الرأسي fstream.h بالبرنامج
2- نعرف متغير قناة (خلينا نسميه قناة) من النوع ifstream
3- نفتح هذه القناة بنفس طريقة فتح قناة الخرج و مع الرايات المناسبة
4- نستخدم القناة (لكن هنا يوجد فرق بسيط سنشرحه الآن)
5- نغلق القناة بالأمر close من جديد
ذلك صحيح تماما لكن ما هو الفرق الذي تحدثت عنه في الخطوة 4 بخصوص استخدام القناة؟
حسناً. إن القناة هي عبارة عن قناة تجلب البيانات من الملف إلى البرنامج وبالتالي لا بد أن يستقبل البرنامج البيانات القادمة (يعني ليس معقول توصل البيانات للبرنامج وما تلاقي أحد ينتظرها ويوديها مكان ما نريد.
إذا لا بد من تعريف متغير يستقبل تلك البيانات. ثم نضعه باستقبالها يعني تماما مثلما نفعل مع الامر cin حيث نضع المتغير الذي سيأخذ القيم المدخلة
لنأخذ مثالاً مشروحا يوضح كل ذلك
مثال(2) :
قراءة حروف من ملف نصي:
C++ كود



// نربط الملف الرأسي الذي يحوي كلاس قنوات الملفات
#include
//لنربط الآن الملف الراسي الخاص بالتعامل مع قنوات الشاشة لاننا سنستخدم أمر الطباعة
#include

void main()
{
// نعرف قناة دخل للملف أي تأتي بالبيانات من الملف إلى البرنامج
ifstream fin;
// لنفتح القناة على الملف الموجود في القرص
fin.open("MyFile.txt" , ios::in);
// تعالو الآن نعرف المتغير الذي سيستقبل البيانات القامة عبر القناة وليكن من النوع الحرفي
char c;
// لنستخدم القناة الآن بجلب حرف من من الملف عبرها ولنستقبله بواسطة المتغير
fin >> c;
// العملية انتهت والحرف الذي قرأناه أخذه المتغير سي الذي وضعناه هل تحب طباعة قيمته؟؟
cout << c << endl;
// حسنا العملية منتهية لكن لنغلق الملف وكان يمكن اغلاقه قبل الطباعة
fin.close()
}



هل لاحظت فرق بين الكتابة على ملف والقراءة منه؟
بالواقع فرق بسيط يتعلق باسماء الكلاسات والفرق الرئيسي بانه يجب استقبال البيانات القادمة.
ممتاز ممتاز الآن نستطيع التعامل مع الملف وتخزين ما نريد ثم استعادته من جديد

الخلاصة(2) :
للقراءة من ملف
1- ربط الملف الرأسي fstream بالبرنامج من خلال الامر include
2- نعرف قناة من النوع ifstream في جسم البرنامج ونسميها كما نحب انا سميتها بالبرنامج fin
C++ كود



ifstream fin;


3- نفتح تلك القناة على ملف مع رايات حسب الطلب او بدون رايات
C++ كود



fin.open( the file name اسم الملف , the flags الرايات );


4- نعرف متغير من النوع الحرفي ونستخدمه مع القناة ليستقبل الحرف الذي سيأتي من الملف.
5- نغلق القناة

لحظة لحظة هل تسرعت في وضع الخلاصة ؟؟؟؟؟
فالبرنامج السابق يقرأ حرف واحد من الملف ماذا لو أحببت أن اقرأ اكثر من حرف كلمة مثلا أو عدد صحيح ماذا أفعل؟؟؟
أمممممم
حسنا حسنا أن هذا يتعلق بنوع الملف
هناك نوعين من الملفات مبدئياً
أولا ملفات text أي نصية من حروف
وملفات ثنائية أي binary .
ما الفرق بينهما.
الفرق بسيط نوعا ما. بالنسبة للحالة الأولى البيانات المخزنة ستخزن كنص أو كحروف يعني حتى لو كان لدينا رقم وليكن 9 مثلا فانه بحسب شيفرة الآسكي لهذا الحرف سيتم تخزينه في الملف كحرف 9
أما في الملف الثنائي فالعدد الصحيح 9 سيخزن في الملف كعدد 9 أو سيقرأ من الملف كالعدد 9 بتحويله للنظام الثنائي.
طيب هل يصبح الموضوع معقدا قليلاً الآن. ما علاقة ذلك بقراءة أكثر من حرف أو قراءة عدد من الملف.
دعوني احافظ على البساطة واتدرج بالشرح وسنأتي لاحقا على موضوع التعامل مع النصوص والارقام
الآن خلونا نكتفي بأن نقرأ من الملف حرف حرف كملف نصي. وفي المواضيع القادمة ضمن هذا الدرس سنتطرق للتعامل مع البيانات المختلفة في الملف.
لنكتب الآن برنامج يقرأ كل ما هو موجود في الملف وليس حرف واحد فقط نما يقرأه حرفاً حرفاً.
مثال(3) :
C++ كود



#include
#include
void main()
{
ifstream fin;
fin.open("MyFile.txt");
char c;
while( ! fin.eof())
{
fin >> c;
cout << c;
}
fin.close();
}



البرنامج واضح وبسيط فيه أمر واحد جديد دعني اشرحه قليلا ثم عد وإقرأ البرنامج مجدا وستفهمه إن لم تكن قد فعلت
الأمر الجديد هو eof وهو آت من العبارة end of file وتعني نهاية الملف.
أي هذا الأمر يدلنا إذا وصلنا لنهاية الملف
عندما نصل إلى آخر الملف ستصبح القيمة التي يعيدها هذا الأمر هي صح أي true وإلا طالما لم نصل فهو سيعطي خطأ أي false
اعتقد واضح لاحظ كيف استخدمناه:
C++ كود



while (! fin.eof())


اي بالعربي يعني:
طالما ( لم( ! ) تصل القناة fin إلى آخر الملف )
كرر الأوامر التالية
اقرأ حرف من الملف واستقبله بالمتغير c
اطبع c على الشاشة
ثم } وعندها يعود للأمر while (طالما) من جديد ويختبر الشرط ثم يدخل وينفذ ويعود وهكذا حتى يصل لآخر الملف
وعندها سيعطي الأمر eof النتيجة صح وبسبب وضع العلامة ! أي لم أو نفي أو لا فالقيمة ستكون خطأ وبالتالي لن يكرر وسيقفز لآخر الحلقة ويتابع البرنامج سيره للنهاية

_________________
http://gflower.computality.com/
الرجوع الى أعلى الصفحة اذهب الى الأسفل
golden flower
مشرفة
مشرفة


انثى
عدد الرسائل : 2517
العمر : 28
تاريخ التسجيل : 28/04/2008

مُساهمةموضوع: رد: شرح اكواد مادة نظم ملفات   الجمعة نوفمبر 28, 2008 9:04 pm


الموضوع(3) :
أمثلة عن القراءة و الكتابة على الملفات.
مثال(4) : (تخزين عبارة يدخلها المستخدم في ملف)
برنامج يأخذ اسم المستخدم ويخزنه في ملف باسم test01.txt على القرص الصلب في السواقة D:
C++ كود



#include
#include
void main()
{
//نعرف متغير لنأخذ فيه اسم المستخدم
char name[20];
// نسأل المستخدم عن اسمه ونأخذ الاسم
cout<<"enter your name:" ; cin >> name;
// ننشئ قناة للتعامل مع الملفات (الكتابة في الملف
ofstream fout;
// نفتح القناة ونجهزها
fout.open("D:\\test01.txt");
// نستعمل القناة بان نرسل فيها اسم المستخدم
fout << name;
// نغلق القناة
fout.close();
}

نفذ البرنامج ثم اذهب وانظر إلى الملف test01.txt بواسطة المفكرة وانظر محتوياته

مثال(5) : (تخزين اكثر من عبارة واستخدام العلامات n\ و t\ مع القناة)
برنامج يأخذ اسماء 3 طلاب و ارقامهم الجامعية ويخزنها في ملف اسمه test02.txt على القرص في السواقة D:
C++ كود



#include
#include
void main()
{
//نعرف متغير لنأخذ فيه اسم المستخدم
char name[20] , ID[10];
// ننشئ قناة للتعامل مع الملفات (الكتابة في الملف
ofstream fout;
// نفتح القناة ونجهزها
fout.open("D:\\test02.txt");

// نعمل حلقة نسأل المستخدمين عن الاسماء والارقام ونخزنها فورا في الملف حتى نتمكن من استخدام المتغيرين لكل المستخدمين
for(int i = 0 ; i < 3 ; i++)
{
cout <<"enter the student name: "; cin >> name;
cout <<"enter the student ID: "; cin >> ID;
// نقوم الآن بادخال الاسم والرقم إلى الملف المطلوب باستخدام القناة التي جهزناها
fout << name << "\t" << ID << endl;
}
// نغلق القناة
fout.close();
}

نفذ البرنامج المثال وادخل الاسماء بدون فراغات في الاسم ذلك يتعلق بالنصوص سنشرحه لاحقا الآن ثم اذهب الآن إلى الملف ولاحظ كيف ان كل اسم ورقم بينهم فراغات بسبب t\ وكيف ان كل واحد بسطر بسبب n\

نفذ البرنامج مرة ثانية واذهب إلى الملف تجد ان البيانات القديمة قد مسحت ووضع مكانها البيانات الجديدة أي انه لا يضيف على السابق.

مثال(6) : (برنامج يضيف اشياء على ملف موجود دون ان يمسح محتوياته)
برنامج يأخذ اسم طالب ورقمه ويضيفه على ملف test02.txt في السواقة D على القرص الصلب
C++ كود



#include
#include
void main()
{
//نعرف متغير لنأخذ فيه اسم المستخدم
char name[20] , ID[10];
// ننشئ قناة للتعامل مع الملفات (الكتابة في الملف
ofstream fout;
// نفتح القناة ونجهزها
fout.open("D:\\test02.txt" , ios:ut | ios::app);
// نطلب من المستخدم ادخال اسمه ومن ثم رقمه
cout <<"enter the student name: "; cin >> name;
cout <<"enter the student ID: "; cin >> ID;
// نقوم الآن بادخال الاسم والرقم إلى الملف المطلوب باستخدام القناة التي جهزناها
fout << name << "\t" << ID << endl;
// نغلق القناة
fout.close();
}

لاحظ ان هذا البرنامج يخزن القيم في نفس الملف السابق test02.txt نفذ البرنامج ثم اذهب إلى الملف test02.txt في القرص d وافتحه بالمفكرة
ولاحظ كيف ان الاسم والرقم الذي أضفته لم يمسح البيانات الموجودة بل اضيف عليها فقط.
نفذ البرنامج أكثر من مرة ولاحظ كيف أنه لا يمسح محتويات الملف أبداً.


مثال(7) : ( القراءة من ملف والطباعة على الشاشة)
برنامج يقرأ محتويات الملف Test02.txt السابق ويطبع محتوياته على الشاشة.
C++ كود



#include
#include
void main()
{
//نعرف متغير لنأخذ فيه اسم المستخدم
char name[20] , ID[10];
// ننشئ قناة للتعامل مع الملفات (الكتابة في الملف
ifstream fin;
// نفتح القناة ونجهزها
fin.open("D:\\test02.txt");
// نجلب البيانات من الملف بالترتيب الذي كتبت فيه
while( ! fin.eof())
{
fin >> name;
fin>> ID;
// نطبع البيانات على الشاشة مع عبارات توضيحية
cout << "name : " << name << "\t ID:" << ID << endl;
}
// نغلق القناة
fout.close();
}


_________________
http://gflower.computality.com/
الرجوع الى أعلى الصفحة اذهب الى الأسفل
golden flower
مشرفة
مشرفة


انثى
عدد الرسائل : 2517
العمر : 28
تاريخ التسجيل : 28/04/2008

مُساهمةموضوع: رد: شرح اكواد مادة نظم ملفات   الجمعة نوفمبر 28, 2008 9:32 pm

سوري يا جماعه مش عارفه الاكواد مش واضحه ليه عمموما اللنك اللي عليه الشرح اهو



http://www.vc4arab.com/showthread.php?t=1529

_________________
http://gflower.computality.com/
الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
شرح اكواد مادة نظم ملفات
استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
 :: منتـداكـــــــــــــــــــــــــــــــــــــــم :: الارشيف-
انتقل الى: