القائمة الرئيسية

الصفحات

ملف الإدخال و الإخراج C - File I/O

ملف الإدخال و الإخراج   File I/O في لغة c

 شرح الفصل الأخير أجهزة الإدخال والإخراج القياسية التي يتم التعامل معها بواسطة لغة البرمجة سي. يغطي هذا الفصل كيف يمكن لمبرمجي لغة البرمجة C إنشاء ملفات نصية أو ثنائية أو فتحها أو إغلاقها لتخزين بياناتهم.

يمثل الملف سلسلة من البايت ، بغض النظر عن كونه ملفًا نصيًا أو ملفًا ثنائيًا. توفر لغة البرمجة C الوصول إلى وظائف عالية المستوى بالإضافة إلى مكالمات المستوى المنخفض (مستوى OS) للتعامل مع الملف على أجهزة التخزين الخاصة بك. سيأخذك هذا الفصل من خلال الدعوات المهمة لإدارة الملفات.

فتح الملفات

يمكنك استخدام وظيفة fopen () لإنشاء ملف جديد أو لفتح ملف موجود. سيؤدي هذا الاستدعاء إلى تهيئة كائن من النوع FILE ، والذي يحتوي على جميع المعلومات اللازمة للتحكم في التدفق. النموذج الأولي لاستدعاء الوظيفة هو كما يلي -

FILE *fopen( const char * filename, const char * mode );

هنا ، اسم الملف عبارة عن سلسلة حرفية ستستخدمها لتسمية ملفك ، ويمكن أن يحتوي وضع الوصول على إحدى القيم التالية -

الأب رقم.الوضع والوصف
1

r

فتح ملف نصي موجود لغرض القراءة.

2

w

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

3

a

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

4

r+

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

5

w+

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

6

a +

يفتح ملف نصي للقراءة والكتابة. يقوم بإنشاء الملف إذا لم يكن موجودًا. ستبدأ القراءة من البداية ولكن الكتابة يمكن إلحاقها فقط.

إذا كنت ستتعامل مع الملفات الثنائية ، فستستخدم أوضاع الوصول التالية بدلاً من تلك المذكورة أعلاه -

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

إغلاق ملف

لإغلاق ملف ، استخدم الوظيفة fclose (). النموذج الأولي لهذه الوظيفة هو -

int fclose( FILE *fp );

و fclose (-) ترجع الدالة صفر على النجاح، أو EOF إذا كان هناك خطأ في إغلاق الملف. تقوم هذه الوظيفة بالفعل بمسح أي بيانات لا تزال معلقة في المخزن المؤقت للملف ، وتغلق الملف ، وتحرر أي ذاكرة مستخدمة للملف. EOF هو ثابت محدد في ملف الرأس stdio.h .

هناك العديد من الوظائف التي توفرها مكتبة C القياسية لقراءة وكتابة ملف ، حرفًا بحرف ، أو في شكل سلسلة ثابتة الطول.

كتابة ملف

فيما يلي أبسط وظيفة لكتابة الأحرف الفردية إلى تيار -

int fputc( int c, FILE *fp );

تكتب الدالة fputc () قيمة حرف الوسيطة c إلى تدفق الإخراج المشار إليه بواسطة fp. تقوم بإرجاع الحرف المكتوب المكتوب على النجاح وإلا EOF إذا كان هناك خطأ. يمكنك استخدام الوظائف التالية لكتابة سلسلة منتهية بقيمة خالية إلى دفق -

int fputs( const char *s, FILE *fp );

تكتب الدالة fputs () السلسلة s إلى دفق الإخراج المشار إليه بواسطة fp. تقوم بإرجاع قيمة غير سالبة عند النجاح ، وإلا يتم إرجاع EOF في حالة حدوث أي خطأ. يمكنك استخدام وظيفة int fprintf (FILE * fp، const char * format، ...) لكتابة سلسلة في ملف. جرب المثال التالي.

تأكد من توفر دليل / tmp . إذا لم يكن كذلك ، فقبل المتابعة ، يجب عليك إنشاء هذا الدليل على جهازك.

#include <stdio.h>

main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنشئ ملفًا جديدًا test.txt في دليل / tmp ويكتب سطرين باستخدام وظيفتين مختلفتين. دعونا نقرأ هذا الملف في القسم التالي.

قراءة ملف

فيما يلي أبسط وظيفة لقراءة حرف واحد من ملف -

int fgetc( FILE * fp );

و fgetc () وظيفة يقرأ حرف من ملف الإدخال المشار إليه من قبل تنظيم الأسرة. القيمة المعادة هي الحرف الذي تمت قراءته ، أو في حالة حدوث أي خطأ ، فإنه يُرجع EOF . تسمح الوظيفة التالية بقراءة سلسلة من الدفق -

char *fgets( char *buf, int n, FILE *fp );

تقرأ الوظائف fgets () ما يصل إلى حرف n-1 من دفق الإدخال المشار إليه بواسطة fp. يقوم بنسخ سلسلة قراءة في المخزن المؤقت BUF ، بإلحاق اغية حرف لإنهاء السلسلة.

إذا واجهت هذه الوظيفة حرفًا جديدًا في السطر "\ n" أو نهاية الملف EOF قبل أن يقرأوا الحد الأقصى لعدد الأحرف ، فإنها ترجع فقط الأحرف التي تمت قراءتها حتى تلك النقطة بما في ذلك حرف السطر الجديد. يمكنك أيضًا استخدام دالة int fscanf (FILE * fp، const char * format، ...) لقراءة السلاسل من ملف ، لكنها تتوقف عن القراءة بعد مواجهة أول حرف مسافة.

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

}

عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تقرأ الملف الذي تم إنشاؤه في القسم السابق وتنتج النتيجة التالية -

1 : This
2: is testing for fprintf...

3: This is testing for fputs...

دعونا نرى المزيد من التفاصيل حول ما حدث هنا. أولاً ، fscanf () اقرأ هذا فقط لأنه بعد ذلك ، واجه مسافة ، والاستدعاء الثاني هو لـ fgets () الذي يقرأ السطر المتبقي حتى يواجه نهاية السطر. أخيرًا ، يقرأ النداء الأخير () السطر الثاني تمامًا.

وظائف الإدخال / الإخراج الثنائية

هناك نوعان من الوظائف التي يمكن استخدامها للمدخلات والمخرجات الثنائية -

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
              
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

يجب استخدام هاتين الوظيفتين لقراءة أو كتابة كتل من الذكريات - عادةً المصفوفات أو الهياكل.


الصفحة التالية                                                                          الصفحة السابقة  

هل اعجبك الموضوع :

تعليقات