English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل تعليم لغة C الأساسية

لغة C التحكم في العملية

الوظائف في لغة C

العدد في لغة C

الإشارات في لغة C

الخطوط في لغة C

مباني لغة C

ملفات لغة C

C أخرى

دليل مرجع لغة C

قراءة وكتابة الملفات في لغة C

في هذا الدرس، ستتعلم كيفية معالجة الملفات في لغة C. ستعلم من خلال الأمثلة كيفية استخدام fprintf()، fscanf()، fread()، fwrite()، fseek() وما إلى ذلك في معالجة I / O القياسية في C.

هي أجهزة التخزين في الحاسوب المستخدمة لتخزين البيانات.

لماذا تحتاج إلى ملفات؟

  • عند إيقاف التشغيل، سيتم فقدان جميع البيانات. حتى بعد إيقاف التشغيل، سيظل البيانات محفوظة في الملف.

  • إذا كنت بحاجة إلى إدخال بيانات كبيرة، سيستغرق ذلك وقتًا طويلاً لكل البيانات.
    لكن إذا كان لديك ملف يحتوي على جميع البيانات، يمكنك استخدام بعض الأوامر في C لفهم محتويات الملف بسهولة.

  • يمكنك نقل البيانات من جهاز كمبيوتر إلى آخر دون الحاجة إلى إجراء أي تغيير.

نوع الملف

عند معالجة الملفات، يجب أن تعرف نوعي الملفين التاليين:

  1. ملفات نصية

  2. ملفات ثنائية

1. ملفات نصية

هي ملفات نصية عادية.txtملف. يمكنك إنشاء ملف نصي باستخدام محرر نصي بسيط (مثل ملاحظات الأحداث).

عند فتح هذه الملفات، ستشاهد محتويات الملف كنص نصي. يمكنك تعديل أو حذف المحتويات بسهولة.

يمكنها العمل مع أقل صيانة، والقراءة بسهولة، وتقديم أقل أمانًا وتأخذ مساحة تخزين أكبر.

2. ملفات ثنائية

تُستخدم ملفات الثنائية بشكل رئيسي في الحواسيب..binملف.

ليس يتم تخزين البيانات بشكل نصي نقية، بل بشكل ثنائي (0 و 1).

مقارنة بالمستندات النصية، يمكنها احتواء بيانات أكثر، والقراءة أقل، وتقديم أمان أفضل.

عمليات الملف

في C، يمكنك تنفيذ أربع عمليات رئيسية على الملفات:

  1. إنشاء ملف جديد

  2. فتح ملف موجود

  3. إغلاق الملف

  4. قراءة المعلومات وكتابتها في الملف

معالجة الملف

عند معالجة الملف، يجب على إعلان مسار نوع الملف. تحتاج الاتصال بين الملف والبرنامج إلى هذا الإعلان.

FILE *fptr;

فتح الملف - لإنشاء وتحرير

فتح الملف باستخدام دالة fopen() المحددة في ملف الربط stdio.h.

تكون جملة فتح الملف في معايير الاستدلال على I / O كالتالي:

ptr = fopen("fileopen","mode");

على سبيل المثال،

fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
  • افترض أن الملف newprogram.txt غير موجود في المسار E:\cprogram. يقوم أول دالة بإنشاء ملف جديد يُدعى newprogram.txt وفقًا لـ'w'فتح الملف للكتابة.
    سماح لك بإنشاء وتحرير محتويات ملف (إزالة).

  • الآن، لنفترض أن ملف ثنائي ثاني oldprogram.bin موجود في المسار E:\cprogram. تقوم الثانية بفتح الملف الموجود، بنمط القراءة والكتابة ثنائيًا.'rb'قراءة.
    يسمح نمط القراءة فقط بقراءة الملف وليس الكتابة فيه.

نماذج فتح في المعايير I / O
النمطمعنى النمطعندما لا يكون الملف موجودًا
rبشكلقراءةالنمطفتح.

إذا لم يكن الملف موجودًا، سيقوم fopen() بتقديم NULL.

rb

فتح للقراءة بنمط ثنائي.

إذا لم يكن الملف موجودًا، سيقوم fopen() بتقديم NULL.
wفتح ملف نصي، يسمح بالكتابة في الملف.

فتح ملف نصي، يسمح بالكتابة في الملف. إذا لم يكن الملف موجودًا، سيتم إنشاء ملف جديد.

في هذا السياق، سيبدأ برنامجك بكتابة المحتويات من بداية الملف.

إذا كان الملف موجودًا، سيتم تقصيره إلى طول صفر، وإعادة الكتابة.

wb

فتح الملف للكتابة بنمط ثنائي.

إذا كان الملف موجودًا، سيتم تغطية محتوياته.
إذا لم يكن الملف موجودًا، سيتم إنشاؤه.
aفتح للإضافة.
يتم إضافة البيانات إلى نهاية الملف.

إذا لم يكن الملف موجودًا، سيتم إنشاؤه.

ab

فتح للإضافة بنمط ثنائي.

يتم إضافة البيانات إلى نهاية الملف.

إذا لم يكن الملف موجودًا، سيتم إنشاؤه.
r+فتح للقراءة والكتابة.

إذا لم يكن الملف موجودًا، سيقوم fopen() بتقديم NULL.

rb+

فتح للقراءة والكتابة بنمط ثنائي.

إذا لم يكن الملف موجودًا، سيقوم fopen() بتقديم NULL.
w+فتح ملف نصي، يسمح بالقراءة والكتابة في الملف

إذا كان الملف موجودًا، سيتم تغطية محتوياته.

إذا لم يكن الملف موجودًا، سيتم إنشاؤه.

wb+

فتح للقراءة والكتابة بنمط ثنائي.

إذا كان الملف موجودًا، سيتم تغطية محتوياته.
إذا لم يكن الملف موجودًا، سيتم إنشاؤه.
a+فتح للقراءة والإضافة.

إذا لم يكن الملف موجودًا، سيتم إنشاؤه.

ab+

فتح للقراءة والإضافة في نمط ثنائي.

إذا لم يكن الملف موجودًا، سيتم إنشاؤه.

إغلاق الملف

بعد القراءة والكتابة، يجب إغلاق الملف (ملفات النص والملفات الثنائية).

يمكن إغلاق الملف باستخدام دالة fclose().

fclose(fptr);

في هذا السياق، fptr هو مؤشر ملف مرتبط بالملف الذي سيتم إغلاقه.

قراءة وكتابة ملفات النص

للقراءة والكتابة في ملفات النص، نستخدم دوال fprintf() وfscanf().

هي مجرد نسخة ملف من printf() وscanf(). الفرق الوحيد هو أن fprint() وfscanf() تحتاج إلى تشير إلى مؤشر بنية FILE.

مثال1: كتابة ملف نصي

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num;
   FILE *fptr;
   // إذا كنت تستخدم MacOS أو Linux، استخدم المسار الصحيح
   fptr = fopen("C:\\program.txt","w");
   if(fptr == NULL)
   {
      printf("Error!");   
      exit(1);             
   }
   printf("Enter num: ");
   scanf("%d",&num);
   fprintf(fptr,"%d",num);
   fclose(fptr);
   return 0;
}

يأخذ البرنامج رقمًا من المستخدم ويخزنه في ملف program.txt.

بعد إجراء التشغيل وتشغيل البرنامج، يمكنك رؤية ملف النص program.txt المكون في محرك C للكمبيوتر. عند فتح الملف، يمكنك رؤية العدد المدخل.

مثال 2: قراءة من ملف نصي

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.txt","r")) == NULL){
       printf("Error! opening file");
       //如果文件指针返回NULL,则程序退出。
       exit(1);
   }
   fscanf(fptr,"%d", &num);
   printf("قيمة n=%d", num);
   fclose(fptr); 
  
   return 0;
}

برنامج يقرأ الأرقام التي موجودة في ملف program.txt ويطبعها على الشاشة.

إذا كنت تأتي منمثال 1تم إنشاء الملف بنجاح، عند تشغيل هذا البرنامج سيقدم لك الرقم الذي أدخلت.

يمكن استخدام دوال أخرى مثل fgetchar() و fputc() بنفس الطريقة.

قراءة وكتابة ملف ثنائي

في حالة الملفات الثنائية، تستخدم دوال fread() و fwrite() للقراءة والكتابة على الملفات الموجودة على القرص.

كتابة في ملف ثنائي

لإكتب في ملف ثنائي، يجب استخدام دالة fwrite(). هذه الدوال تأخذ أربعة معلمات:

  1. عنوان البيانات التي نريد كتابتها على القرص

  2. حجم البيانات التي نريد كتابتها على القرص

  3. عدد هذه البيانات

  4. مؤشر إلى الملف الذي نريد كتابته.

fwrite(addressData, sizeData, numbersData, pointerToFile);

مثال 3: كتابة ملف ثنائي باستخدام fwrite()

#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
   int n1, n2, n3;
};
int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
       printf("Error! opening file");
       // إذا عاد مؤشر الملف إلى NULL، يخرج البرنامج.
       exit(1);
   }
   for(n = 1; n < 5; ++n)
   {
      num.n1 = n;
      num.n2 = 5 * n;
      num.n3 = 5 * n + 1;
      fwrite(&num, sizeof(struct threeNum), 1, fptr); 
   }
   fclose(fptr); 
  
   return 0;
}

في هذا البرنامج، ننشئ ملفًا جديدًا في محرك C مع اسم program.bin.

نعلن هيكل threeNum يحتوي على ثلاثة أرقام n1، n2 و n3، ونحدد num في الدالة الرئيسية.

الآن، في الدائرة for، نستخدم fwrite() لتخزين القيم في الملف.

المعلم الأول يأخذ عنوان num، والمعلم الثاني يأخذ حجم هيكل threeNum.

بما أننا نضيف فقط مثال واحد من num، فإن المعلم الرابع هو 1. المعلم الأخير *fptr يشير إلى الملف الذي نريد تخزين البيانات فيه.

في النهاية، نغلق الملف.

قراءة من ملف ثنائي

دالة fread() تستخدم أربعة معلمات مشابهة لدالة fwrite() المذكورة أعلاه.

fread(addressData, sizeData, numbersData, pointerToFile);

مثال 4: قراءة ملف ثنائي باستخدام fread()

#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
   int n1, n2, n3;
};
int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");
       //如果文件指针返回NULL,则程序退出。
       exit(1);
   }
   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3);
   }
   fclose(fptr); 
  
   return 0;
}

在此程序中,您读取相同的文件program.bin,并逐个循环浏览记录。

简单来说,您将从*fptr指向的文件中读取一个threeNum大小的threeNum*fptrnum记录到num结构中。

您将获得与示例3中插入的记录相同的记录。

使用fseek()获取数据

如果文件中有很多记录,并且需要访问特定位置的记录,则需要遍历所有记录才能获取该记录。

这将浪费大量的内存和操作时间。使用fseek()可以轻松获得所需数据。

顾名思义,fseek()将光标定位到文件中的给定记录。

fseek()的语法

fseek(FILE *stream, long int offset, int whence);

第一个参数流是指向文件的指针。第二个参数是要查找的记录的位置,第三个参数指定偏移量开始的位置。

fseek()中的不同位置
位置含义
SEEK_SET从文件开头开始偏移。
SEEK_END

从文件的末尾开始偏移。

SEEK_CUR

从文件中光标的当前位置开始偏移。

示例5:fseek()

#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
   int n1, n2, n3;
};
int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");
       //如果文件指针返回NULL,则程序退出。
       exit(1);
   }
   
   // 将光标移到文件末尾
   fseek(fptr, -sizeof(struct threeNum), SEEK_END);
   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
      fseek(fptr, -2 * sizeof(struct threeNum), SEEK_CUR);
   }
   fclose(fptr); 
  
   return 0;
}

سيبدأ البرنامج بترتيب معكوس (من الأخير إلى الأول) في قراءة السجلات من ملف program.bin وإدراجها في الطباعة.