الخميس، 1 أكتوبر 2020

برمجة الكمبيوتر - ملف الإدخال والإخراج i/O file

برمجة الكمبيوتر - ملف الإدخال والإخراج i/O file



يتم استخدام ملف الكمبيوتر لتخزين البيانات بتنسيق رقمي مثل نص عادي أو بيانات الصورة أو أي محتوى آخر. يمكن تنظيم ملفات الكمبيوتر داخل أدلة مختلفة. تُستخدم الملفات للاحتفاظ بالبيانات الرقمية ، بينما تُستخدم الأدلة للاحتفاظ بالملفات.

يمكن اعتبار ملفات الكمبيوتر بمثابة النظير الرقمي للمستندات الورقية. بينما البرمجة، عليك أن تبقي التعليمات البرمجية المصدر في ملفات نصية مع إضافات مختلفة، على سبيل المثال، ملفات البرمجة C مع نهاية التمديد .C ، جافا برمجة الملفات مع . JAVA ، وملفات بيثون مع .py .

إدخال / إخراج الملف

عادةً ما تقوم بإنشاء ملفات باستخدام برامج تحرير النصوص مثل notepad أو MS Word أو MS Excel أو MS Powerpoint وما إلى ذلك. ومع ذلك ، في كثير من الأحيان ، نحتاج إلى إنشاء ملفات باستخدام برامج الكمبيوتر أيضًا. يمكننا تعديل ملف موجود باستخدام برنامج كمبيوتر.

إدخال الملف يعني البيانات التي تتم كتابتها في ملف ويعني إخراج الملف البيانات التي تتم قراءتها من ملف. في الواقع ، ترتبط شروط الإدخال والإخراج بدرجة أكبر بإدخال وإخراج الشاشة. عندما نعرض نتيجة على الشاشة ، تسمى الإخراج. وبالمثل ، إذا قدمنا ​​بعض المدخلات لبرنامجنا من موجه الأوامر ، فإنه يسمى الإدخال.

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

أوضاع تشغيل الملف

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

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

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

  • وضع القراءة والكتابة - إذا كنت ستقوم بالقراءة والكتابة في نفس الملف ، فستفتح الملف في وضع القراءة والكتابة.

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

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

فتح الملفات

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

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

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

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

ص

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

2

ث

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

3

أ

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

4

ص +

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

5

ث +

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

6

أ +

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

إغلاق ملف

لإغلاق ملف ، استخدم الوظيفة 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، ...) لكتابة سلسلة في ملف. جرب المثال التالي -

#include <stdio.h>

int 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 () وظيفة يقرأ حرف من ملف الإدخال المشار إليه من قبل FP . القيمة المعادة هي قراءة الحرف ؛ أو في حال وجود أي خطأ، فإنها ترجع 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 () ، والذي يقرأ السطر المتبقي حتى يواجه نهاية السطر. أخيرًا ، يقرأ النداء الأخير () السطر الثاني تمامًا.

ملف الإدخال / الإخراج في جافا

توفر Java مجموعة أغنى من الوظائف للتعامل مع إدخال / إخراج الملف. لمزيد من المعلومات حول هذا الموضوع ، نقترح عليك مراجعة دروس Java التعليمية.

هنا ، سنرى برنامج Java بسيطًا ، وهو مكافئ لبرنامج C الموضح أعلاه. سيقوم هذا البرنامج بفتح ملف نصي ، وكتابة بضعة أسطر نصية فيه ، وإغلاق الملف. أخيرًا ، يتم فتح الملف نفسه ثم قراءته من ملف تم إنشاؤه بالفعل. يمكنك محاولة تنفيذ البرنامج التالي لرؤية الإخراج -

import java.io.*;

public class DemoJava {
   public static void main(String []args) throws IOException {
      File file = new File("/tmp/java.txt");
      
      // Create a File
      file.createNewFile();
      
      //  Creates a FileWriter Object using file object
      FileWriter writer = new FileWriter(file); 
      
      // Writes the content to the file
      writer.write("This is testing for Java write...\n");
      writer.write("This is second line...\n");
      
      // Flush the memory and close the file
      writer.flush();
      writer.close();
      
      // Creates a FileReader Object
      FileReader reader = new FileReader(file); 
      char [] a = new char[100];
      
      // Read file content in the array
      reader.read(a);
      System.out.println( a );
      
      // Close the file
      reader.close();
   }
}

عند تنفيذ البرنامج أعلاه ، فإنه ينتج النتيجة التالية -

This is testing for Java write...
This is second line...

ملف الإدخال / الإخراج في بايثون

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

# Create a new file
fo = open("/tmp/python.txt", "w")

# Writes the content to the file
fo.write( "This is testing for Python write...\n");
fo.write( "This is second line...\n");

# Close the file
fo.close()

# Open existing file
fo = open("/tmp/python.txt", "r")

# Read file content in a variable
str = fo.read(100);
print str

# Close opened file
fo.close()

عندما يتم تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -

This is testing for Python write...
This is second line...


التسميات:

برمجة الكمبيوتر - الوظائف او الدوال functions

برمجة الكمبيوتر - الوظائف او الدوال  functions 




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

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

لنبدأ ببرنامج حيث سنحدد صفيفتين من الأرقام ، ثم من كل مصفوفة ، سنجد أكبر رقم. فيما يلي الخطوات لمعرفة الحد الأقصى لعدد من مجموعة معينة من الأرقام -

1. Get a list of numbers L1, L2, L3....LN
2. Assume L1 is the largest, Set max = L1
3. Take next number Li from the list and do the following
4.    If max is less than Li
5.       Set max = Li
6.    If Li is last number from the list then
7.       Print value stored in max and come out
8. Else prepeat same process starting from step 3

دعنا نترجم البرنامج أعلاه بلغة البرمجة C -

#include <stdio.h>

int main() {
   int set1[5] = {10, 20, 30, 40, 50};
   int set2[5] = {101, 201, 301, 401, 501};
   int i, max;
   
   /* Process first set of numbers available in set1[] */
   max = set1[0];
   i = 1;    
   while( i < 5 ) {
      if( max <  set1[i] ) {
         max = set1[i];
      }
      i = i + 1;
   }
   
   printf("Max in first set = %d\n", max );
    
   /* Now process second set of numbers available in set2[] */
   max = set2[0];
   i = 1;    
   while( i < 5 ) {
      if( max <  set2[i] ) {
         max = set2[i];
      }
      i = i + 1;
   }
   printf("Max in second set = %d\n", max );
}

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

Max in first set = 50
Max in second set = 501

إذا كنت واضحًا بشأن المثال أعلاه ، فسيكون من السهل فهم سبب حاجتنا إلى وظيفة. في المثال أعلاه ، هناك مجموعتان فقط من الأرقام ، المجموعة 1 والمجموعة 2 ، ولكن ضع في اعتبارك موقفًا يكون لدينا فيه 10 مجموعات متشابهة من الأرقام أو أكثر لمعرفة الحد الأقصى من الأرقام من كل مجموعة. في مثل هذه الحالة ، سيتعين علينا التكرار والمعالجة 10 مرات أو أكثر ، وفي النهاية ، سيصبح البرنامج كبيرًا جدًا مع تكرار التعليمات البرمجية. للتعامل مع مثل هذا الموقف ، نكتب وظائفنا حيث نحاول الاحتفاظ بالشفرة المصدرية التي سيتم استخدامها مرارًا وتكرارًا في برامجنا.

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

تحديد الوظيفة

الشكل العام لتعريف الوظيفة في لغة البرمجة C هو كما يلي -

return_type function_name( parameter list ) {
   body of the function
   
   return [expression];
}

وهناك تعريف وظيفة في البرمجة C يتكون من رأس وظيفة و ظيفة الجسم . فيما يلي جميع أجزاء الوظيفة -

  • نوع الإرجاع - قد ترجع الدالة قيمة. نوع return هو نوع البيانات للقيمة التي تُرجعها الدالة. تقوم بعض الوظائف بتنفيذ العمليات المطلوبة بدون إرجاع قيمة. في هذه الحالة ، فإن return_type هي الكلمة الأساسية void .

  • اسم الوظيفة - هذا هو الاسم الفعلي للوظيفة. يشكل اسم الوظيفة وقائمة المعلمات معًا توقيع الوظيفة.

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

  • جسم الوظيفة - يحتوي جسم الوظيفة على مجموعة من العبارات التي تحدد وظيفة الوظيفة.

استدعاء وظيفة

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

الآن ، دعنا نكتب المثال أعلاه بمساعدة دالة -

#include <stdio.h>

int getMax( int set[] ) {
   int i, max;
   
   max = set[0];
   i = 1;    
   while( i < 5 ) {
      if( max <  set[i] ) {
         max = set[i];
      }
      i = i + 1;
   }
   return max;
}
main() {
   int set1[5] = {10, 20, 30, 40, 50};
   int set2[5] = {101, 201, 301, 401, 501};
   int max;

   /* Process first set of numbers available in set1[] */
   max = getMax(set1);
   printf("Max in first set = %d\n", max );
    
   /* Now process second set of numbers available in set2[] */
   max = getMax(set2);
   printf("Max in second set = %d\n", max );
}

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

Max in first set = 50
Max in second set = 501

وظائف في جافا

إذا كنت واضحًا بشأن الوظائف في برمجة C ، فمن السهل فهمها في Java أيضًا. أسماء برمجة جافا بأنها الأساليب لا تزال، ولكن بقية المفاهيم أكثر أو أقل نفسه.

فيما يلي البرنامج المكافئ المكتوب بلغة جافا. يمكنك محاولة تنفيذه لرؤية الإخراج -

public class DemoJava {
   public static void main(String []args) {
      int[] set1 = {10, 20, 30, 40, 50};
      int[] set2 = {101, 201, 301, 401, 501};
      int max;

      /* Process first set of numbers available in set1[] */
      max = getMax(set1);
      System.out.format("Max in first set = %d\n", max );

      /* Now process second set of numbers available in set2[] */
      max = getMax(set2);
      System.out.format("Max in second set = %d\n", max );
   }
   public static int getMax( int set[] ) {
      int i, max;
      max = set[0];
      i = 1;    
      
      while( i < 5 ) {
         if( max <  set[i] ) {
            max = set[i];
         }
         i = i + 1;
      }
      return max;
   }
}

عند تنفيذ البرنامج أعلاه ، فإنه ينتج النتيجة التالية -

Max in first set = 50
Max in second set = 501

الوظائف في بايثون

مرة أخرى ، إذا كنت تعرف مفهوم الوظائف في برمجة C و Java ، فإن Python لا تختلف كثيرًا. فيما يلي الصيغة الأساسية لتعريف دالة في Python -

def function_name( parameter list ):
   body of the function
   
   return [expression]

باستخدام صيغة الوظيفة هذه في Python ، يمكن كتابة المثال أعلاه على النحو التالي -

def getMax( set ):
   max = set[0]
   i = 1   
   
   while( i < 5 ):
      if( max <  set[i] ):
         max = set[i]
      
      i = i + 1
   return max

set1 = [10, 20, 30, 40, 50]
set2 = [101, 201, 301, 401, 501]

# Process first set of numbers available in set1[]
max = getMax(set1)
print "Max in first set = ", max
    
# Now process second set of numbers available in set2[]
max = getMax(set2)
print "Max in second set = ", max

عندما يتم تنفيذ الكود أعلاه ، فإنه ينتج النتيجة التالية -

Max in first set =  50
Max in second set =  501

التسميات: