الملفات
| English | العربية |
|---|---|
| file/faɪl/ | ملف |
| text file/tekst faɪl/ | ملف نصي |
| secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ | التخزين الثانوي |
| persistence/pəˈsɪstəns/ | الاستمرار |
| end of file/end ɒv faɪl/ | نهاية الملف |
| separator/ˈsepəreɪtə/ | فاصل |
| sequential/siːˈkwenʃl/ | متسلسل |
اللعبة التي تذكرت
- حتى عام 1987، كان إيقاف جهاز الألعاب يحذف كل شيء. كانت كل جلسة تبدأ من الشاشة الأولى؛ كان اللعبة الطويلة تعني فترة ظهيرة طويلة أو لا شيء.
- أسطورة زيلدا جاءت مع بطارية صغيرة داخل الكارتريج تحافظ على بضعة مئات من البايتات حية. للمرة الأولى، كان بإمكان لعبة المنزل الحفظ، واستكمال ما تركته.
- كل سجل عالٍ، وكل مستند، وإعداد حفظته سابقًا موجود لنفس السبب: RAM ينسى عند انقطاع الطاقة، بينما الملف لا يفعل.
- هذا الدرس هو سبب وجود الملفات وكيف تقرأ وتكتب خوارزمية الوصف الزائف ملف نصي، سطرًا تلو الآخر.
لماذا الملفات
- المتغيرات تعيش في RAM وتختفي عند انتهاء البرنامج. ملف على التخزين الثانوي يحافظ على البيانات بين تشغيلات البرنامج: الاستمرارية.
- تسمح الملفات بمخرجات برنامج واحد أن تصبح مدخلات لبرنامج آخر، بحيث يمكن مشاركة البيانات.
- يمكن للملف أن يحتوي على أكثر مما يتسع للذاكرة، ويمكن للبرنامج إعادة التشغيل من حالة محفوظة.

المتغير مفقود في نهاية التشغيل؛ الملف لا يزال موجودًا غدًا
لماذا يكتب البرنامج بيانات في ملف بدلاً من الاحتفاظ بها في متغير؟
الذاكرة المؤقتة عابرة، لذا تُفقد البيانات عند الخروج. الملف على التخزين الثانوي يستمر بين الجلسات.
الملفات النصية والأوضاع الثلاثة
- الملف النصي يخزن البيانات كسطور من الأحرف، يقرأها ويكتبها برنامج واحدًا تلو الآخر، من البداية. هذا التسلسل من السطور هو ما يسمح للحلقة بالمرور عليها.
OPENFILE … FOR READيقرأ من السطر الأول.FOR WRITEينشئ ملفًا جديدًا، أو يستبدل ملفًا موجودًا.FOR APPENDيضيف أسطرًا جديدة في النهاية، محتفظًا بما هو موجود.- افتح قبل الاستخدام، أغلق بعده. الملف له وضع واحد في كل مرة.
طابق كل نمط لفتح الملف بما يقوم به.
READ يقرأ؛ WRITE يستبدل من الصفر؛ APPEND يضيف إلى النهاية دون فقدان الموجود.
لإضافة أسطر إلى نهاية ملف موجود دون فقدان محتوياته، افتحه FOR ____.
سيبدأ WRITE الملف فارغاً. يحافظ APPEND على الموجود ويكتب بعده.
قراءة كل سطر
OPENFILE "data.txt" FOR READ
WHILE NOT EOF("data.txt") DO
READFILE "data.txt", LineString
OUTPUT LineString
ENDWHILE
CLOSEFILE "data.txt"
EOFيختبر نهاية الملف. اختبره قبل كل قراءة: القراءة<std نهاية الملف هي خطأ.CLOSEFILEمهم: قد تفقد البيانات المخبأة وتُستبعد برامج أخرى عن ملف مُترك مفتوحًا.
التعامل مع ملف: فتح → استخدام → إغلاق
مرّ في دورة حياة كل ملف. الجزآن اللذان يُنسيهما الناس بسهولة هما اختبار EOF أثناء القراءة في حلقة، والإغلاق دائماً في النهاية.
ماذا يختبر EOF؟
يتم التحقق من EOF (نهاية الملف) قبل كل قراءة حتى تتوقف الحلقة عندما لا توجد مزيد من البيانات.
لماذا يجب عليك دائماً إغلاق ملف بعد استخدامه؟
الإغلاق يفرغ الكتابات المخزنة مؤقتاً إلى القرص ويحرر القفل حتى تتمكن البرامج الأخرى من استخدام الملف.
كتابة الأسطر
OPENFILE "log.txt" FOR WRITE
FOR i ← 1 TO 100
WRITEFILE "log.txt", "Event " & NUM_TO_STR(i)
NEXT i
CLOSEFILE "log.txt"
WRITEيبدأ الملف فارغًا. لإضافة سجل يجب أن يحتفظ بتاريخه، افتحهFOR APPENDبدلاً من ذلك.- الملف النصي يحتوي على سلاسل نصية: يتم تحويل الرقم مع
NUM_TO_STRفي طريق الخروج.
مثال محلول: آخر ثلاثة أسطر من ملف
- اكتب إجراءً
LastLines(FileName)يُخرج آخر ثلاثة أسطر من ملف نصي، بالترتيب.
PROCEDURE LastLines(BYVAL FileName : STRING)
DECLARE LineX, LineY, LineZ : STRING
LineX ← ""
LineY ← ""
LineZ ← ""
OPENFILE FileName FOR READ
WHILE NOT EOF(FileName) DO
LineX ← LineY
LineY ← LineZ
READFILE FileName, LineZ
ENDWHILE
CLOSEFILE FileName
OUTPUT LineX
OUTPUT LineY
OUTPUT LineZ
ENDPROCEDURE
- كل سطر جديد يدفع الأسطر السابقة للأمام، لذا عند
EOFتحمل المتغيرات الثلاثة آخر ثلاثة أسطر؛ الملف الأقصر يُخرج سلاسل فارغة. بالنسبة لأول خمسة أسطر، عد القراءات وتوقف عند خمسة أو عندEOF، whichever comes first. الملف الفارغ يجعلEOFصحيحًا فورًا بعد الفتح.
رتّب خطوات إجراء LastLines بالترتيب.
تهيئة، فتح، حلقة مع النقل قبل القراءة، إغلاق، إخراج. النقل بعد القراءة سيؤدي إلى فقدان أحدث سطر.
الحقول في السطر
- يُكتب السجل كـ سطر واحد، حقوله موصولة بـ فاصل أحرف، ويتم تحويل كل رقم أو منطق مع
NUM_TO_STR(وقراءة العودة معSTR_TO_NUM، أو بالمقارنة مع"TRUE"). - اختر فاصلاً لا يمكن أن يظهر أبداً في البيانات: الفاصلة أو
|للأسماء والأرقام؛ تجنب المسافة إذا كان الاسم قد يحتوي عليها. - قراءة عكسية: اقرأ السطر، قم بتقسيمه عند الفاصل، حوّل كل حقل إلى نوعه، واحفظه في السجل.

الدمج بفاصل للكتابة؛ والتقسيم والتحويل للقراءة
يسجل السطر الاسم الكامل للاعب والنتيجة. أي فاصل هو الاختيار الأكثر أماناً؟
لا يجب أن يظهر الفاصل داخل حقل. الاسم الكامل يحتوي على مسافة، والنتيجة تحتوي على أرقام.
يمكن كتابة INTEGER في ملف نصي مباشرة، دون تحويله إلى سلسلة نصية أولاً.
يحتوي الملف النصي على أسطر من الأحرف. حول باستخدام NUM_TO_STR للكتابة و STR_TO_NUM للقراءة مجدداً.
مثال محلول: حفظ سجل، واستعادته
- السجل
Playerله حقولName : STRINGوScore : INTEGER. اكتب شبه كود لإضافته إلىscores.txtفي سطر واحد، ولقراءة سطر واحد عائدًا إلى السجل.
OPENFILE "scores.txt" FOR APPEND
WRITEFILE "scores.txt", Player.Name & "," & NUM_TO_STR(Player.Score)
CLOSEFILE "scores.txt"
OPENFILE "scores.txt" FOR READ
READFILE "scores.txt", Line
Pos ← POSITION(Line, ",")
Player.Name ← LEFT(Line, Pos - 1)
Player.Score ← STR_TO_NUM(MID(Line, Pos + 1, LENGTH(Line) - Pos))
CLOSEFILE "scores.txt"
- الدرجات: الوضع الصحيح، وتحويل الرقم في كلا الاتجاهين، وفاصل لا يمكن أن يظهر في اسم، وإغلاق كلا الملفين.
لتخزين سجل كسطر واحد في ملف نصي، يجب على البرنامج: حدد كل ما ينطبق.
تحويل، جمع، كتابة، إغلاق. الملف النصي لا يحتوي على ترتيب ثنائي؛ هذا ما يفعله الملف الثنائي.
الوصول التسلسلي والمباشر
- الملف النصي تسلسلي (متتابع): يُقرأ بالترتيب من البداية، لذا فإن العثور على سطر ما يتطلب قراءة جميع الأسطر التي تسبقه.
- المباشر (عشوائي) ينتقل مباشرة إلى سجل عند موضع محسوب دون قراءة البقية؛ وهو يتطلب سجلات ذات طول ثابت، وهو ما لا يتوفر في الملفات النصية.
- للمنهج الدراسي، تُعد حلقة الملف النصي أعلاه النموذج: فتح، اختبار
EOF، قراءة، إغلاق.
الوصول المباشر (العشوائي) يسمح للبرنامج بالقفز مباشرة إلى سجل دون قراءةOthers أولاً.
يجب أن يقرأ الوصول التسلسلي من البداية.
علامات ضائعة
- القراءة تجاوزاً للنهاية. اختبر
EOFقبل كلREADFILE. - فتح
FOR WRITEعندما يجب أن يحافظ الملف على محتوياته. هذا هوAPPEND. - كتابة رقم بدون
NUM_TO_STR، أو قراءته عكسياً بدونSTR_TO_NUM. يحمل الملف النصي نصوصاً فقط. - نسيان
CLOSEFILE، أو استخدام ملف قبلOPENFILE. كلاهما يفقد درجة التعامل مع الملفات.
لقد فهمت الأمر
- توفر الملفات ثباتاً: تتجاوز البيانات نهاية البرنامج، ويمكن مشاركتها، وقد تتجاوز سعة الذاكرة.
OPENFILE … FOR READ | WRITE | APPEND→READFILE/WRITEFILE→CLOSEFILE؛WRITEيستبدل،APPENDيضيف في النهاية- اختبر
EOFقبل كل قراءة؛ وحوّل الأرقام باستخدامNUM_TO_STRللخارج وSTR_TO_NUMللداخل - سجل واحد = سطر واحد، حقول موصولة بـ فاصل لا يظهر أبداً في البيانات