فمثلا :
الصور : تعتبر ملفات
البرامج : تعتبر ملفات
الصوت والأفلام : تعتبر ملفات
وهكذا ...
لكن في فقرتنا هذه سنتطرق إلى 4 مسائل فقط :
-
فتح ملف وغلقه
-
إنشاء أو الكتابة في ملف
-
الإضافة في نهاية الملف
-
قراءة ملف
1. فتح ملف وغلقه
1.1 تعريف ملف
إننا لا نتعامل على مستوى البرمجة مع أسماء الملفات مباشرة (يعني أننا لا نستعمل اسم الملف الحقيقي الموجود في القرص)، ففي C يجب أن نعرف متغيرا يرتبط بالملف الذي نود التعامل معه، ولأجل ذلك نكتب مثلا في منطقة التعريفات :
FILE *name_file; |
ملاحظة : يجب أن تكتب FILE هكذا أي بالحروف الكبيرة.
1.2 فتح ملف
عند قيامنا بتعريف المتغير الذي سنربطه بملف ما، يجب بعد ذلك أن نعطيه اسم الملف ومكانه في القرص، ولأجل ذلك توجد دالة في C تقوم بهذا الدور وهي fopen.
بنيتها :
FILE *fichier1; |
هناك في الغالب 3 طرق للفتح وهي :
"r" : للقراءة من الملف.
"w" : للكتابة في الملف.
"a" : للإضافة إلى الملف.
مثال : لنفتح 3 ملفات واحد من أجل القراءة وآخر للكتابة والأخير للإضافة
FILE *fichier1,*fichier2,*fichier3; |
1.3 غلق ملف
عند قيامنا بفتح ملف حسب رغبتنا يجب علينا في آخر المشروع أن نغلق هذا الملف، ولأجل ذلك توجد دالة في C تقوم بهذا الدور وهي fclose.
بنيتها :
FILE *fichier1; |
مثال :
FILE *fichier1,*fichier2,*fichier3; |
ملاحظة : لا يهم أن تقوم بغلق الملفات مرتبة أو معكوسة كما فتحت.
2. الكتابة في ملف
2.1 الكتابة في ملف
كما هو معلوم عند الكتابة في الشاشة نستعمل مثلا الدالة printf أو puchar ...
مثال :
int a=30; |
أما بالنسبة للملفات فإنه يوجد مثل هذه الدوال وهي كالتالي :
fprintf(nom_fichier,"format",variables) |
: مثل الدالة printf لكنها مخصصة للملفات. |
fputc('chararcter',nom_fichier) |
: مثل الدالة putchar لكنها مخصصة للملفات. |
للكتابة في ملف اتبع الخطوات التالية :
- قم بتعريف الاسم النسبي الذي ستربطه بالملف الحقيقي
- افتح الملف للكتابة "w" (ملاحظة: إن لم يكن الملف موجودا سيتم إنشاءه للكتابة فيه)
- اكتب فيه ما تشاء باستعمال الدالة fprintf أو الدالة fputc
- أغلق الملف
مثال عام :
#include <stdio.h> printf("Write a name of file : "); |
2.2 الإضافة إلى ملف
للإضافة في آخر الملف نفتح الملف بـ "a" عوض "w"، ونكتب إذا :
P_FICHIER = fopen(NOM_FICHIER,"a"); /* للإضافة */ |
3. القراءة من ملف
3.1 القراءة من ملف
كما هو معلوم عند القراءة من لوحة المفاتيح نستعمل مثلا الدالة scanf أو getchar ...
مثال :
int a; |
أما بالنسبة للملفات فإنه يوجد مثل هذه الدوال وهي كالتالي :
fscanf(nom_fichier,"format",&variables) |
: مثل الدالة scanf لكنها مخصصة للملفات. |
chararcter =fgetc(nom_fichier) |
: مثل الدالة getchar لكنها مخصصة للملفات. |
3.2 الدالة feof
تقوم هذه الدالة بالتحقق هل تم الوصول إلى نهاية الملف عند القراءة، وتكون نتيجتها هي الصفر طالما لم نصل إلى نهاية الملف.
حيث نكتب : feof(nom_fichier)
3.3 ملاحظة عامة بالنسبة للتسجيلات التي تمت كتابتها في ملف
تذكر هذا جيدا!!
إن طريقة كتابة المعطيات أو التسجيلات في ملف بالدالة fprintf يجب أن تكون هي نفسها عند القراءة بالدالة fscanf.
مثال على ذلك :
fprintf(P_FICHIER, "%d %c\t%s\n %l\n",x,c,nom,z); /* اكتب في الملف */ |
3.4 خلاصة
للقراءة من ملف اتبع الخطوات التالية :
- قم بتعريف الاسم النسبي الذي ستربطه بالملف الحقيقي
- افتح الملف للقراءة "r" (ملاحظة: إن لم يكن الملف موجودا سيكون هناك خطأ يرجع إلى اسم الملف النسبي ويجب الخروج باستعمال الدالة exit)
- اقرأ منه ما تشاء باستعمال الدالة fscanf أو الدالة fgetc
- أغلق الملف
مثال عام 1: بدون استعمال الدالة exit للخروج في حالة عدم وجود الملف المطلوب قراءته
#include <stdio.h> while (!feof(P_FICHIER)) /* طالما لم نصل إلى نهاية الملف */ fclose(P_FICHIER); |
مثال عام 2 : نفس المثال السابق لكن حتى يدخل المستعمل الاسم الصحيح للملف.
#include <stdio.h>
|
مثال عام 3 : نفس المثال السابق لكن باستعمال الدالة exit للخروج في حالة عدم وجود الملف المطلوب قراءته.
#include <stdio.h> if (!P_FICHIER) |
4. مثال للقراءة والكتابة باستعمال الدالتين fgetc و putc
مثال : نسخ ملف في آخر
#include <stdio.h> if (!FP1) |
تمارين تطبيقية
التمرين 11.1
أنجز على القرص المرن A ثم أظهر على الشاشة الملف INFORM.TXT الذي يحتوي على التسجيل التالي :
-
الرقم التسلسلي للمنتوج (نوع int ).
-
الاسم
-
النسب
عدد التسجيلات محدد من طرف المستعمل من خلال لوحة المفاتيح.
التمرين 11.2
أنجز على القرص المرن A ثم أظهر على الشاشة الملف INFBIS.TXT الذي يحتوي على نسخة طبق الأصل للملف INFORM.TXT.
التمرين 11.3
أضف تسجيلا جديدا على الملف INFORM.TXT وأحفظ الملف تحت الاسم INFBIS.TXT.
التمرين 11.4
أضف تسجيلا جديدا على الملف INFORM.TXT لكن باعتبار أن الإضافة تتم حسب ترتيب الاسماء قاموسيا وأحفظ الملف تحت الاسم INFBIS.TXT.
التمرين 11.5
أزل أو احذف من INFORM.TXT جميع التسجيلات :
أ) التي تحتوي على الرقم التسلسلي المنتهي بـ 8.
ب) التي تحتوي على الأسماء المعكوسة. من الأفضل أن تنشأ دالة تكون نتيجتها 1 إذا كانت الكلمة أو الجملة معكوسة أو 0 إذا كان عكس ذلك.
احفظ النتائج في ملف جديد INFBIS.TXT.
التمرين 11.6
أنجز على القرص المرن A ثم أظهر على الشاشة الملف FAMILLE.TXT الذي يحتوي على التسجيل التالي :
-
النسب العائلي
-
اسم الأب
-
اسم الأم
-
عدد الأطفال
-
أسماء الأطفال
عدد التسجيلات محدد من طرف المستعمل من خلال لوحة المفاتيح ومرتبط بعدد الأطفال.
التمرين 11.7
أنجز شفرة لإنشاء الملف MOTS.TXT على القرص المرن يحمل مجموعة متكونة من 50 كلمة على الأكثر (50 حرفا كأقصى حد لكل كلمة) باستعمال متغير واحد .أدخل الرمز '*' لإنهاء إدخال الكلمات، هذا الرمز لا يجب حفظه في الملف.
التمرين 11.8
أنجز شفرة تُظهر عدد الكلمات وعدد الكلمات المعكوسة وكذلك الطول المتوسط للكلمات الموجودة في الملف MOTS.TXT . استعمل الدالتين PALI و LONG_CH المعرفتين في الفقرة 10.
التمرين 11.9
أنجز شفرة تقوم بتحميل الكلمات الموجودة في الملف MOTS.TXT في الذاكرة، رتبهم قاموسيا وأنشئ ملفا ثان MOTS_TRI.TXT في القرص المرن. استعمل جدول المؤشرات (نوع char) ، أما حجز المكان في الذاكرة فيتم حركيا.
التمرين 11.10
بمساعدة محرر للنصوص، مثلا 'bloc-note' ، أنشئ ملفا NOMBRES.TXT يحتوي على مجموعة من الأعداد منفصل عن بعضها البعض بـ 'الرجوع إلى السطر'. أنجز شفرة تقوم باستعراض الأعداد على الشاشة من خلال هذا الملف وكذلك حاصل مجموعها ومتوسطها.
التمرين 11.11
أنجز شفرة تقوم بإبدال 'الرجوع إلى السطر' بـ 'الفراغ' في ملف يحتوي على نص. إذا كانت مجموعة من 'الرجوع إلى السطر' على التوالي يكفي إبدال الأول بـ 'الفراغ'. أسماء الملفات مطلوب إدخالها من لوحة المفاتيح.
ملاحظة : هناك ملفين :الأول للقراءة، والثاني للكتابة.
التمرين 11.12
أنجز شفرة تقوم بتحديد عدد الجمل المنتهية بالنقطة أو علامة التعجب أو علامة الاستفهام في ملف مطلوب إدخال اسمه من لوحة المفاتيح.
استعمل دالة FIN_PHRASE للمساعدة ، هذه الدالة تكون نتيجتها 1 إذا كان الحرف أو الرمز يساوي '.' أو '؟' أو '!' ، و 0 إن كان عكس ذلك.
التمرين 11.13
أنجز شفرة تقوم من خلال ملف مطلوب إدخال اسمه من لوحة المفاتيح، بتحديد :
-
عدد الحروف والرموز الإجمالي المحتوي في الملف.
-
عدد المرات التي تكرر فيها كل حرف (بدون اعتبار الفرق بين الحروف الكبيرة والصغيرة).
-
عدد الكلمات.
-
عدد الفقرات (كل فقرة محددة بالرجوع إلى السطر).
إليك بعض الاعتبارات :
-
'الرجوع إلى السطر' لا تعتبره كحرف أو رمز.
-
نقبل أن كل كلمتين منفصلتين بإحدى الرموز التالية (الفواصل):
-
نهاية السطر 'الرجوع إلى السطر'.
-
الفراغ.
-
القوسين ( ).
-
أدوات الاستفهام: يعني . : , ; ؟ !
-
الرمز "
-
الرمز '
-
استعمل دالة SEPA للمساعدة ، هذه الدالة تكون نتيجتها 1 إذا كان الحرف أو الرمز من الفواصل المذكورة أعلاه ، و 0 إن كان عكس ذلك.
مثال:
Name of the text file : A:LITTERA.TXT
Your file has:
12 paragraphs
571 words
4186 characters
that have
279 times of alphabet a
56 times of alphabet b
. . .
3 times of alphabet z
and 470 other characters
التمرين 11.14
أنجز شفرة تُظهر محتوى ملف ضخم على الشاشة ذات 25 سطرا و 80 عمودا. إذا امتلأت الشاشة تقوم لشفرة بانتظار المستعمل أن يضغط على المفتاح 'ENTER' لمعاينة الصفحة التالية وهكذا..
التمرين 11.15: مبدأ كلمة المرور
أنجز شفرة تقوم بالتحقق من صحة رقم تسلسلي CCP موجود في ملف. الرقم التسلسلي CCP متكون من 3 أجزاء : رقم الحساب، فاصل '-' ورقم المراقبة.
صحة الرقم التسلسلي CCP تتم بإحدى الشروط التالية:
-
إذا كان باقي القسمة الصحيحة لرقم الحساب على 97 يخالف الصفر ويساوي رقم المراقبة.
-
إذا كان باقي القسمة على 97 يساوي الصفر و رقم المراقبة يساوي 97.
أمثلة :
|
استعمل دالة CCP_TEST لها متغيرين للدخول ، أحدهما لأجل رقم الحساب والآخر لرقم المراقبة، تقوم هذه الدالة بإظهار رسالة أو جملة تعبر عن صحة الرقم التسلسلي.
ملاحظة : بمساعدة محرر للنصوص كـ 'bloc-note' قم بإنشاء ملف CCP.TXT يحتوي على عدة أرقام تسلسلية لاستخدامها.
التمرين 11.16
ملفين FA و FB المطلوب إدخال اسميهما من لوحة المفاتيح يحتويان على أعداد صحيحة مرتبة تزايديا. أنجز شفرة تقوم بنسخ أو نقل محتوى FA و FB على التوالي في الجدولين TABA و TABB. الجدول TABC يضم الجدولين TABA و TABB لكن ذلك حسب الترتيب التزايدي. بعد الانتهاء من ملء الجدول TABC يجب حفظه في الملف FC المطلوب إدخال اسمه من لوحة المفاتيح.
ملاحظة : استعمل المؤشر عوض الجدول.
تأليف
المؤلف الأصلي: فرديريك فابر (Frédéric FABER)
البريد الإلكتروني: عنوان البريد الإلكتروني هذا محمي من روبوتات السبام. يجب عليك تفعيل الجافاسكربت لرؤيته.
الموقع الإلكتروني: http://www.ltam.lu/cours-c
ترجمة بتصرف: محمد عبد الرحمان