أنت هنا:برمجها»اللغة س»الدرس 11: الملفات المتتالية
الدرس 11: الملفات المتتالية الدرس 11: الملفات المتتالية
قيم الموضوع
(1 تصويت)

الملفات هي التي نتعامل معها دوما، لأنها تحتفظ لنا بالمعلومات التي نريدها، هذا من جهة، ومن جهة أخرى تكون دائما الملفات مرافقة لمشاريعنا... وليكن في العلم أنه بالنسبة للمبرمج تعتبر الشاشة ولوحة المفاتيح كملفات أولية يتعامل معها منذ البداية، حيث تتم القراءة من لوحة المفاتيح، والكتابة على الشاشة...(وكذلك جميع الأجهزة المدعمة للحاسوب تعتبر ملفات).

فمثلا :

الصور : تعتبر ملفات

البرامج : تعتبر ملفات

الصوت والأفلام : تعتبر ملفات

وهكذا ...

لكن في فقرتنا هذه سنتطرق إلى 4 مسائل فقط :

  • فتح ملف وغلقه

  • إنشاء أو الكتابة في ملف

  • الإضافة في نهاية الملف

  • قراءة ملف


1. فتح ملف وغلقه

1.1 تعريف ملف

إننا لا نتعامل على مستوى البرمجة مع أسماء الملفات مباشرة (يعني أننا لا نستعمل اسم الملف الحقيقي الموجود في القرص)، ففي C يجب أن نعرف متغيرا يرتبط بالملف الذي نود التعامل معه، ولأجل ذلك نكتب مثلا في منطقة التعريفات :

 FILE *name_file;

ملاحظة : يجب أن تكتب FILE هكذا أي بالحروف الكبيرة.

1.2 فتح ملف

عند قيامنا بتعريف المتغير الذي سنربطه بملف ما، يجب بعد ذلك أن نعطيه اسم الملف ومكانه في القرص، ولأجل ذلك توجد دالة في C تقوم بهذا الدور وهي fopen.

بنيتها :

 FILE *fichier1;
 fichier1 = fopen("path ","طريقة الفتح");

هناك في الغالب 3 طرق للفتح وهي :

"r"  : للقراءة من الملف.

"w" : للكتابة في الملف.

"a" : للإضافة إلى الملف.

مثال :  لنفتح 3 ملفات واحد من أجل القراءة وآخر للكتابة والأخير للإضافة

 FILE *fichier1,*fichier2,*fichier3;
 fichier1 = fopen("c:\\sisi.txt","r");
 fichier2 = fopen("a:\\didi.dat","w");
 fichier3 = fopen("c:\\windows\\path\\boot.ini","a");


1.3 غلق ملف

عند قيامنا بفتح ملف حسب رغبتنا يجب علينا في آخر المشروع أن نغلق هذا الملف، ولأجل ذلك توجد دالة في C تقوم بهذا الدور وهي fclose.

بنيتها :

 FILE *fichier1;
 .... 
 fclose(fichier1);

مثال :

FILE *fichier1,*fichier2,*fichier3;
fichier1 = fopen("c:\\sisi.txt","r");
fichier2 = fopen("a:\\didi.dat","w");
fichier3 = fopen("c:\\windows\\path\\boot.ini","a");
.....
.....
fclose(fichier2);
fclose(fichier3);
fclose(fichier1);

ملاحظة : لا يهم أن تقوم بغلق الملفات مرتبة أو معكوسة كما فتحت. 


2. الكتابة في ملف

2.1 الكتابة في ملف

كما هو معلوم عند الكتابة في الشاشة نستعمل مثلا الدالة printf أو puchar ...

مثال :

int a=30;
char c='A',*ch="salamo 3laikom";
printf("%d %c %s\n",a,c,ch);
putchar(c);

أما بالنسبة للملفات فإنه يوجد مثل هذه الدوال وهي كالتالي :

fprintf(nom_fichier,"format",variables)

: مثل الدالة printf لكنها مخصصة للملفات.

fputc('chararcter',nom_fichier)

: مثل الدالة putchar لكنها مخصصة للملفات.

للكتابة في ملف اتبع الخطوات التالية :

  1. قم بتعريف الاسم النسبي الذي ستربطه بالملف الحقيقي
  2. افتح الملف للكتابة "w" (ملاحظة: إن لم يكن الملف موجودا سيتم إنشاءه للكتابة فيه)
  3. اكتب فيه ما تشاء باستعمال الدالة fprintf أو الدالة fputc
  4. أغلق الملف

مثال عام :

#include <stdio.h>

 
main()
{
 FILE *P_FICHIER;                          /* اسم الملف النسبي */
 char NOM_FICHIER[30], NOM_PERS[30];
 int C,NB_ENREG;

 printf("Write a name of file : ");
 scanf("%s", NOM_FICHIER);                 /* المرجو إدخال اسم الملف الحقيقي*/
 P_FICHIER = fopen(NOM_FICHIER,"w");       /* للكتابة */
 printf("Enter number of records: ");
 scanf("%d", &NB_ENREG);

 C = 0;
 while (C<NB_ENREG)
 {
  printf("Person name: ");                /* أكتب في الشاشة */
  scanf("%s", NOM_PERS);                   /* اقرأ من لوحة المفاتيح */
  fprintf(P_FICHIER, "%s\n", NOM_PERS);    /* أكتب في الملف */
  C++;
 }

 fclose(P_FICHIER);

 return 0;
}

2.2 الإضافة إلى ملف

للإضافة في آخر الملف نفتح الملف بـ "a" عوض "w"، ونكتب إذا :

 P_FICHIER = fopen(NOM_FICHIER,"a");  /* للإضافة */ 

3. القراءة من ملف

3.1 القراءة من ملف

كما هو معلوم عند القراءة من لوحة المفاتيح نستعمل مثلا الدالة scanf أو getchar ...

مثال :

int a;
char c,ch[30]";
scanf("%d %c %s",&a,&c,ch);
getchar(c);

أما بالنسبة للملفات فإنه يوجد مثل هذه الدوال وهي كالتالي :

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);   /* اكتب في الملف */
fscanf(P_FICHIER, "%d %c\t%s\n %l\n",&x,&c,nom,&z); /* اقرأ من الملف */

3.4 خلاصة

للقراءة من ملف اتبع الخطوات التالية :

  1. قم بتعريف الاسم النسبي الذي ستربطه بالملف الحقيقي
  2. افتح الملف للقراءة "r" (ملاحظة: إن لم يكن الملف موجودا سيكون هناك خطأ يرجع إلى اسم الملف النسبي ويجب الخروج باستعمال الدالة exit)
  3. اقرأ منه ما تشاء باستعمال الدالة fscanf أو الدالة fgetc
  4. أغلق الملف

مثال عام 1: بدون استعمال الدالة exit للخروج في حالة عدم وجود الملف المطلوب قراءته

#include <stdio.h>

main()
{
 FILE *P_FICHIER;                     /* اسم الملف النسبي */
 char NOM_FICHIER[30], NOM_PERS[30];
 printf("Write the name of file : ");
 scanf("%s", NOM_FICHIER);            /* المرجو إدخال اسم الملف الحقيقي*/
 P_FICHIER = fopen(NOM_FICHIER, "r"); /* للقراءة */

 while (!feof(P_FICHIER))             /* طالما لم نصل إلى نهاية الملف */
 {
  fscanf(P_FICHIER, "%s\n", NOM_PERS);/* اقرأ من الملف */
  printf("NOM : %s\n", NOM_PERS);     /* أكتب في الشاشة */
 }
 

 fclose(P_FICHIER);
 return 0;
}

مثال عام 2 : نفس المثال السابق لكن حتى  يدخل المستعمل الاسم الصحيح للملف.

#include <stdio.h>


main()
{
 FILE *P_FICHIER;                      /* اسم الملف النسبي */
 char NOM_FICHIER[30], NOM_PERS[30];
 do
 {

  printf("Write the name of file: ");
  scanf("%s", NOM_FICHIER);            /* المرجو إدخال اسم الملف الحقيقي*/
  P_FICHIER = fopen(NOM_FICHIER, "r");
  if (!P_FICHIER)
  printf("\aERROR: cannot open the file: %s.\n", NOM_FICHIER);
 }


 while (!feof(P_FICHIER))              /* طالما لم نصل إلى نهاية الملف */
 {
  fscanf(P_FICHIER, "%s\n", NOM_PERS); /* اقرأ من الملف */
  printf("Name: %s\n", NOM_PERS);      /* أكتب في الشاشة */
 }

 fclose(P_FICHIER);

 return 0;
}

مثال عام 3 : نفس المثال السابق لكن باستعمال الدالة exit للخروج في حالة عدم وجود الملف المطلوب قراءته.

#include <stdio.h>
#include <stdlib.h>

main()
{
 FILE *P_FICHIER;                      /* اسم الملف النسبي */
 char NOM_FICHIER[30], NOM_PERS[30];
 printf("Name of file please: ");
 scanf("%s", NOM_FICHIER);             /* المرجو إدخال اسم الملف الحقيقي*/
 P_FICHIER = fopen(NOM_FICHIER, "r");

  if (!P_FICHIER)
 {
  printf("\Error: cant open "
          "the file: %s.\n", NOM_FICHIER);
  exit(-1);                            
/* الخروج من المشروع */
 }


 while (!feof(P_FICHIER))              /* طالما لم نصل إلى نهاية الملف */
 {
  fscanf(P_FICHIER, "%s\n", NOM_PERS); /* اقرأ من الملف */
  printf("NOM : %s\n", NOM_PERS);      /* أكتب في الشاشة */
 }

 fclose(P_FICHIER);

 return 0;
}


4. مثال للقراءة والكتابة باستعمال الدالتين fgetc و putc

مثال : نسخ ملف في آخر

#include <stdio.h>
#include <stdlib.h>

main()
{
 FILE *FP1,*FP2;
 char C;
 FP1 = fopen("C:\\AUTOEXEC.BAT", "r");
 FP2 = fopen("C:\\AUTOEXEC.txt", "w");

 if (!FP1)
 {
 printf("Cannot open the file\n");
 exit(-1);
 }

 while (!feof(FP1))
 {
  C=fgetc(FP1);  /*اقرأ حرفا من الملف FP1*/
  putchar(C);    /*اكتب على الشاشة*/
  fputc(C,FP2)); /*اكتب حرفا في الملف FP2*/
 }

 fclose(FP);
 return 0;
}


تمارين تطبيقية

 

التمرين 11.1

أنجز على القرص المرن A ثم أظهر على الشاشة الملف  INFORM.TXT  الذي يحتوي على التسجيل التالي :

  1. الرقم التسلسلي للمنتوج (نوع int ).

  2. الاسم

  3. النسب

عدد التسجيلات محدد من طرف المستعمل من خلال لوحة المفاتيح.


التمرين 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  الذي يحتوي على التسجيل التالي :

  1. النسب العائلي

  2. اسم الأب

  3. اسم الأم

  4. عدد الأطفال

  5. أسماء الأطفال

عدد التسجيلات محدد من طرف المستعمل من خلال لوحة المفاتيح ومرتبط بعدد الأطفال.


التمرين 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

أنجز شفرة تقوم من خلال ملف مطلوب إدخال اسمه من لوحة المفاتيح، بتحديد :

  1. عدد الحروف والرموز الإجمالي المحتوي في الملف.

  2. عدد المرات التي تكرر فيها كل حرف (بدون اعتبار الفرق بين الحروف الكبيرة والصغيرة).

  3. عدد الكلمات.

  4. عدد الفقرات (كل فقرة محددة بالرجوع إلى السطر).

إليك بعض الاعتبارات :

  • 'الرجوع إلى السطر' لا تعتبره كحرف أو رمز.

  • نقبل أن كل كلمتين منفصلتين بإحدى الرموز التالية (الفواصل):

    • نهاية السطر 'الرجوع إلى السطر'.

    • الفراغ.

    • القوسين ( ).

    • أدوات الاستفهام: يعني  . : , ; ؟ !

    • الرمز "

    • الرمز '

استعمل دالة 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 تتم بإحدى الشروط التالية:

  1. إذا كان باقي القسمة الصحيحة لرقم الحساب على 97  يخالف الصفر ويساوي رقم المراقبة.

  2. إذا كان باقي القسمة على 97  يساوي الصفر و رقم المراقبة يساوي 97.

أمثلة :

correct   15742 % 97 = 28   Nombre CCP 15742-28 :  
correct   72270 % 97 = 5   Nombre CCP 72270-5 :  
incorrect   22610 % 97 = 9   Nombre CCP 22610-10 :  
  50537 % 97 = 0   Nombre CCP 50537-0 :  
  nombre incorrect, because valeur= 97.    
correct   50537 % 97 = 0   Nombre  CCP 50537-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

ترجمة بتصرف: محمد عبد الرحمان


 

مقالات أخرى من نفس الفئة « الدرس 10: الدوال الدرس 12: البنيات »

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث