PrAmJnEt مدير عام
عدد المساهمات : 396 نقاط : 146692 العمر : 65
| موضوع: تابع دوره فى لغه السى 15 الإثنين مايو 11, 2009 1:49 pm | |
| السلام عليكم و رحمة الله و بركاته
الملفات مع السي
هل فكرت يوماً بعمل برنامج ولنقل مثلاً لمكتب عقاري ؟ هل فكرت يوماً بعمل برنامج يقوم بعمل معين ولكنك تحتاج إلى البيانات الموجوده فيه مسبقاً و لا تريدها ان تضيع بمجرد إقفال البرنامج ؟
الحل سيكون إستخدام الملفات بالتأكيد ...فهي المعنى الحقيقي للبرمجة و هي التي تقوم بجعل البرامج العديمة الفائدة مفيدة جداً , فتخيل برنامج Word مثلاً بدون الملفات ؟!!! لن يكون له اي فائدة عدى القليل جداً .
طبعاً اقصد بالملفات هي الحفظ و الفتح التي تقوم بها يوميا تقريباً في برامجك .
عموماً لن نطيل في هذه المقدمات كثيراً و لنبداء البرمجة بإستخدام الملفات :
الملفات في أي لغة [b]لن تتعامل معها مباشرة ( أي بإسم الملف ) و لكنك ستتعامل مع مؤشر إلى الملف و لنبدأ: أولاً كيف يمكننا أن نعرف مؤشر إلى ملف ؟ ________________________________________________________________________________ 1. التعريف :
FILE *file_pointer; مع العلم ان كلمة FILE لابد ان تكون بالحروف الكبيره و file_pointer هي كلمة إختيارية تختارها أنت و لتكن مثلاً fp لسهولة الإستعمال و لكن لابد أن تسبق بالعلامة * فقط في التعريف ( كما هو موضح في الأعلى ) أي أن المتغير سيكون مؤشر للملف. __________________________________________________________________________________
2. فتح الملف : لابد من فتح الملف قبل إستخدامة مثلة مثل فتح ( تشغيل ) الكمبيوتر قبل إستخدامة ولفتح الملف سنستعمل الدالة التالية :
FILE *fopen ( const char *filename, const char *mode ) ;
الـ filename هو إسم الملف الذي يكون ظاهر للمستخدم مثلاً talal.txt و الـ mode هو طبيعة فتح الملف فهناك اكثر من صفة لفتح الملف سأذكرها بعد قليل فلو كان لدينا هذا التعريف :
FILE *fp; و نريد ان نفتح ملف إسمة talal.txt فسنفتحه بالطريقة التالية :
fp = fopen( "talal.txt", "w" ) ; إذا لم يتمكن النظام من فتح الملف سنعيد في الـ fp قيمة NULL . و لنرى الصفات التي تفتح عليها الملفات : [table:632e id="AutoNumber1" style="border-collapse: collapse;" class="posting-table" border="1" bordercolor="#111111" cellpadding="0" cellspacing="0" width="100%"][tr][td width="15%"]الطريقة[/td][td width="85%"]الوصف[/td][/tr][tr][td width="15%"]r[/td][td width="85%"]open a text file for reading أي فتح ملف للقراءة[/td][/tr][tr][td width="15%"]w[/td][td width="85%"]open a text file for writing أي فتح ملف للكتابة و إذا كان الملف موجود يقوم بمسح محتوياته[/td][/tr][tr][td width="15%"]a[/td][td width="85%"](open a text file for appending (adding info to the END of file فتح للإضافة إلى النهاية[/td][/tr][tr][td width="15%"]+r[/td][td width="85%"]( opening a text file for update ( reading and writing فتح ملف للتحديث ( قرائة و كتابة )[/td][/tr][tr][td width="15%"]+w[/td][td width="85%"]open a text file for update. If the file exists it is truncated to zero length. If it does not exists it is created يفتح ملف للتعديل ( للقرائة و الكتابة ) إذا كان الملف موجود فإنة تلغى محتوياته أما إن لم يكن موجود فإن النظام ينشأة[/td][/tr][tr][td width="15%"]+a[/td][td width="85%"]open a text file for update ( reading and writing ). Writing is only allowed at the end of file. But any part of the file can be readed. If the file does not exists the system create it فتح الملف للتعديل و التحديث و لكن الإضافة تكون في نهاية الملف و بينما القرائة تكون من أي مكان في الملف. إذا لم يكن الملف موجود اصلاً فإن النظام تقوم بإنشاء هذا الملف.[/td][/tr][tr][td colspan="2" width="100%"]Adding a 'b' changes the file type from text to binary. Apart from that the string will have the same effect. و عند إضافة الحرف 'b' إلى نوع الفتح سيتغير من فتح ملف من نوع text إلى فتح من نوع binary. و سيكون لملف الـ Binary نفس خصائص الحروف بالـ text . [/td][/tr][/table]
إذاً إذا أردنا أن نفتح ملف للقرائة منه ماذا نفعل ؟ الجواب هو كالتالي :
fp = fopen("talal.txt", "r");
و إذا أردنا فتح الملف للقراءة و الكتابة معاً يمكننا ذلك بطرق أحدها:
fp = fopen("talal.txt", "r+"); // OR by using w+ OR using a+
________________________________________________________________________________
3. إغلاق الملف :
كما فتحنا الملف في البداية لابد من اإغلاقة عند الإنتهاء منه أليس كذلك ؟!! بالتأكيد سنغلقة في حال إنتهينا من إستعمال الملف و الدالة المسؤلة عن إغلاق الملف هي:
int fclose(FILE *file_pointer );
هكذا فقط . فلو كان عندنا التعريف التالي :
FILE *fp ; fp = fopen("talal.txt", "w") ;
سنغلق هذا الملف هكذا :
fclose ( fp ) ;
فقط, هذا كل ما في الأمر. أليس هذا سهلاً ؟!!
وإذا لم ينفتح الملف لأي سبب من الأسباب كأمتلاء الذاكرة, ستعيد الدالة القيمة NULL.
_________________________________________________________________________________
4. الإدخال و الإخراج من الملفات ( I/O with files ) :
الآن قد انتهينا من كيفية فتح و إغلاق الملفات إلى هذه النقطة لم نتعلم كيف نحفظ ما قمنا بعمله, للقيام بذلك هناك عدة دوال مسؤالة عن هذا الشيء منها: الدالة الأولى هي :
int putc( char ch, FILE *file_pointer );
و هي موجوده ضمن ملف stdio.h . و لنأخذ مثال على هذه الدالة :
#include "stdio.h" main() { FILE *fp ; char ch ; fp = fopen("talal.txt", "w"); while( ( ch = getche() ) != 'r' ) putc(ch, fp);
fclose(fp) ; return 0 ; }
لقد قمت بتنفيذ هذا البرنامج فوجدت ملف إسمة talal.txt في نفس المجلد الذي يوجد به الكود الذي نفذتة فوجدت بداخلة الجملة التي كتبتها و هي :
Hi this is Talal
بعد تنفيذ البرنامج الأول لنقم بكتابة هذا الكود بعده :
#include "conio.h" #include "stdio.h" main() { FILE *fp ; char ch ; fp = fopen("talal.txt", "r"); while( (ch = getc(fp) ) != EOF ) printf("%c",ch);
fclose(fp) ; return 0 ; }
هذا الكود يقوم بقرائة الملف و طباعة محتواه على الشاشة , و لكن ما هي و ظيفة الدالة getc ؟ هذه دالة للقرائة من ملف و هي على الصيغة التالية :
char getc( FILE *file_pointer ) ;
و هي توجد في الملف stdio.h , ولشرح هذا البرنامج بالتفصيل : عرفنا مؤشر إلى ملف بإسم fp , ثم قمنا بفتح الملف بإستخدام الدالة fopen و فتحناه على صيغة قرائة من ملف 'w' , الان مؤشر الملف على اول حرف في الملف , ثم دخلنا الدوارة while فنقراء أول حرف و نضع قيمتة في الـ ch و نقارنة بالقيمة EOF و هي تعني End Of File ( نهاية الملف ) فنستمر في القرائة من الملف و نطبع على الشاشة قيمة الـ ch إذا لم تكن EOF | |
|