جيم دروس البرمجة على التعامل مع ملف الوصول العشوائي

click fraud protection

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

برمجة ملف الوصول العشوائي I / O في C

ملف ثنائي
دي ثامون / جيتي إيماجيس

عمليات الملف الأساسية هي:

  • fopen - فتح ملف - تحديد كيفية فتحه (قراءة / كتابة) والنوع (ثنائي / نص)
  • fclose - إغلاق ملف مفتوح
  • fread - قراءة من ملف
  • fwrite - الكتابة إلى ملف
  • fseek / fsetpos - انقل مؤشر الملف إلى مكان ما في الملف
  • ftell / fgetpos - يخبرك بمكان وجود مؤشر الملف

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

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

instagram viewer

برمجة الملفات الثنائية

الملف الثنائي هو ملف من أي طول يحتوي على وحدات بايت ذات قيم في النطاق من 0 إلى 255. هذه البايتات ليس لها معنى آخر بخلاف في ملف نصي حيث القيمة 13 تعني إرجاع السطر و 10 يعني تغذية السطر و 26 تعني نهاية الملف. يجب أن تتعامل برامج قراءة الملفات النصية مع هذه المعاني الأخرى.

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

يعرض نموذج التعليمات البرمجية هذا ملفًا ثنائيًا بسيطًا يتم فتحه للكتابة ، مع كتابة سلسلة نصية (char *) فيه. عادة ما ترى هذا مع ملف نصي ، ولكن يمكنك كتابة نص إلى ملف ثنائي.

يفتح هذا المثال ملفًا ثنائيًا للكتابة ثم يكتب حرف * (سلسلة) فيه. يتم إرجاع متغير FILE * من استدعاء fopen (). إذا فشل هذا (قد يكون الملف موجودًا ويكون مفتوحًا أو للقراءة فقط أو قد يكون هناك خطأ في اسم الملف) ، فإنه يعود 0.

يحاول الأمر fopen () فتح الملف المحدد. في هذه الحالة ، يكون الملف test.txt في نفس المجلد مثل التطبيق. إذا تضمن الملف مسارًا ، فيجب مضاعفة جميع الخطوط المائلة العكسية. "c: \ folder \ test.txt" غير صحيح ؛ يجب عليك استخدام "c: \\ folder \\ test.txt".

نظرًا لأن وضع الملف هو "wb" ، فإن هذا الرمز يكتب إلى ملف ثنائي. يتم إنشاء الملف إذا لم يكن موجودًا ، وإذا كان موجودًا ، فسيتم حذف كل ما هو موجود فيه. إذا فشل استدعاء fopen ، ربما لأن الملف مفتوح أو يحتوي الاسم على أحرف غير صالحة أو مسار غير صالح ، فإن fopen تُرجع القيمة 0.

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

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

أوضاع الملف لقراءة وكتابة الملفات

عندما تفتح ملفًا ، فإنك تحدد كيفية فتحه - سواء إنشائه من جديد أو استبداله وما إذا كان نصًا أو ثنائيًا ، أو القراءة أو الكتابة وما إذا كنت تريد الإلحاق به. يتم ذلك باستخدام محدد أو أكثر لوضع الملفات ، وهو عبارة عن أحرف مفردة "r" و "b" و "w" و "a" و "+" مع الأحرف الأخرى.

  • ص - يفتح الملف للقراءة. يفشل هذا إذا كان الملف غير موجود أو لا يمكن العثور عليه.
  • ث - يفتح الملف كملف فارغ للكتابة. في حالة وجود الملف ، يتم إتلاف محتوياته.
  • أ - يفتح الملف للكتابة في نهاية الملف (ملحق) دون إزالة علامة EOF قبل كتابة بيانات جديدة إلى الملف ؛ يؤدي هذا إلى إنشاء الملف أولاً إذا لم يكن موجودًا.

تؤدي إضافة "+" إلى وضع الملف إلى إنشاء ثلاثة أوضاع جديدة:

  • r + - لفتح الملف للقراءة والكتابة. (يجب أن يكون الملف موجودًا.)
  • w + - لفتح الملف كملف فارغ للقراءة والكتابة. في حالة وجود الملف ، يتم إتلاف محتوياته.
  • a + - يفتح الملف للقراءة والإلحاق ؛ تتضمن عملية الإلحاق إزالة علامة EOF قبل كتابة البيانات الجديدة في الملف ، واستعادة علامة EOF بعد اكتمال الكتابة. يقوم بإنشاء الملف أولاً إذا لم يكن موجودًا. يفتح الملف للقراءة والإلحاق ؛ تتضمن عملية الإلحاق إزالة علامة EOF قبل كتابة البيانات الجديدة في الملف ، واستعادة علامة EOF بعد اكتمال الكتابة. يقوم بإنشاء الملف أولاً إذا لم يكن موجودًا.

تركيبات وضع الملف

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

  • ص النص - قراءة
  • RB + ثنائي - قراءة
  • ص + نص - قراءة وكتابة
  • r + b ثنائي - قراءة وكتابة
  • RB + ثنائي - قراءة وكتابة
  • نص w - كتابة ، إنشاء ، اقتطاع
  • WB ثنائي - الكتابة ، إنشاء ، اقتطاع
  • نص + نص - قراءة ، كتابة ، إنشاء ، اقتطاع
  • w + b ثنائي - قراءة ، كتابة ، إنشاء ، اقتطاع
  • wb + binary - قراءة ، كتابة ، إنشاء ، اقتطاع
  • نص - كتابة وخلق
  • ab ثنائي - الكتابة ، إنشاء
  • نص + - قراءة وكتابة وإنشاء
  • a + b ثنائي - الكتابة ، إنشاء
  • ab + ثنائي - الكتابة ، إنشاء

ما لم تكن تقوم فقط بإنشاء ملف (استخدم "wb") أو قراءة ملف واحد فقط (استخدم "rb") ، يمكنك الابتعاد باستخدام "w + b".

تسمح بعض التطبيقات أيضًا برسائل أخرى. مايكروسوفت، على سبيل المثال ، يسمح:

  • وضع النص t
  • ج - ارتكاب
  • ن - عدم الالتزام
  • S - تحسين التخزين المؤقت للوصول المتسلسل
  • R - التخزين المؤقت غير المتسلسل (وصول عشوائي)
  • ت - مؤقت
  • د- حذف / مؤقت مما يقتل الملف عند إغلاقه.

هذه ليست محمولة لذا استخدمها على مسؤوليتك الخاصة.

مثال لتخزين ملف الوصول العشوائي

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

فحص مثال

افترض أن المثال يوضح الفهرس وزوج ملف البيانات الذي يقوم بتخزين السلاسل في ملف وصول عشوائي. السلاسل هي أطوال مختلفة ويتم فهرستها حسب الموضع 0 ، 1 وهكذا.

هناك دالتان فارغتان: CreateFiles () و ShowRecord (int recnum). يستخدم CreateFiles مخزنًا مؤقتًا char * بحجم 1100 للاحتفاظ بسلسلة مؤقتة تتكون من سلسلة التنسيق msg متبوعة بعلامة النجمة n حيث تختلف n من 5 إلى 1004. يتم إنشاء ملفين * على حد سواء باستخدام وضع الملف wb في المتغيرات ftindex و ftdata. بعد إنشائها ، يتم استخدامها لمعالجة الملفات. الملفان

  • index.dat
  • data.dat

يحتوي ملف الفهرس على 1000 سجل من نوع indextype؛ هذا هو نوع الهيكل الأساسي ، والذي يحتوي على العضوين (من نوع fpos_t) والحجم. الجزء الأول من الحلقة:

يملأ السلسلة msg مثل هذا.

وهلم جرا. ثم هذا:

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

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

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

تفرض وظيفة تدفق الملف التنظيف ، ويمكنك أيضًا تحديد إستراتيجيات تدفق الملف ، ولكن هذه الاستراتيجيات مخصصة للملفات النصية.

دالة ShowRecord

لاختبار إمكانية استرداد أي سجل محدد من ملف البيانات ، تحتاج إلى معرفة شيئين: من أين يبدأ في ملف البيانات ومدى حجمه.

هذا ما يفعله ملف الفهرس. تفتح وظيفة ShowRecord كلا الملفين ، وتسعى إلى النقطة المناسبة (recnum * sizeof (indextype) وتجلب عددًا من وحدات البايت = sizeof (فهرس).

SEEK_SET هو ثابت يحدد من أين يتم إجراء fseek. هناك نوعان من الثوابت المحددة لهذا الغرض.

  • SEEK_CUR - البحث عن الموقع الحالي
  • SEEK_END - اطلب مطلقًا من نهاية الملف
  • SEEK_SET - اطلب المطلق من بداية الملف

يمكنك استخدام SEEK_CUR لتحريك مؤشر الملف إلى الأمام حسب sizeof (الفهرس).

بعد الحصول على حجم البيانات وموقعها ، يبقى فقط لجلبها.

هنا ، استخدم fsetpos () بسبب نوع index.pos وهو fpos_t. طريقة بديلة هي استخدام ftell بدلاً من fgetpos و fsek بدلاً من fgetpos. يعمل الزوجان fseek و ftell مع int بينما يستخدم fgetpos و fsetpos fpos_t.

بعد قراءة السجل في الذاكرة ، يتم إلحاق حرف فارغ \ 0 لتحويله إلى ذاكرة مناسبة سلسلة ج. لا تنسى وإلا ستحصل على تحطم. كما كان من قبل ، يتم استدعاء fclose على كلا الملفين. على الرغم من أنك لن تفقد أي بيانات إذا نسيت fclose (على عكس الكتابة) ، فسوف يكون لديك تسرب للذاكرة.

instagram story viewer