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

I/O للملفات في Lua

مكتبة I/O بلغة Lua تستخدم لقراءة وتعامل الملفات. تتكون من فيمدية بسيطة (مثل C) وفيمدية كامل.

  • فيمدية بسيطة (simple model) تملك ملف إدخال حالي ومخرج حالي، وتقدم عمليات متعلقة بهذه الملفات.

  • فيمدية كامل (complete model) تستخدم ملفات التعامل الخارجية لتحقيق ذلك. إنه يتعامل مع جميع عمليات الملف كطرق لملف التعامل، ويأخذ شكلًا موجهًا إلى الأجسام.

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

تعليمات فتح الملف كالتالي:

file = io.open (filename[, mode])

قيم mode هي:

النمطالوصف
rفتح ملف قابل للقراءة فقط، يجب أن يكون الملف موجودًا.
wفتح ملف قابل للكتابة فقط، إذا كان الملف موجودًا، يتم إزالة طول الملف إلى صفر، مما يعني أن محتويات الملف ستختفي. إذا لم يكن الملف موجودًا، يتم إنشاؤه.
aفتح ملف قابل للكتابة فقط بالتضيف. إذا لم يكن الملف موجودًا، سيتم إنشاؤه. إذا كان الملف موجودًا، سيتم إضافة البيانات المكتوبة إلى نهاية الملف، مما يعني أن محتويات الملف السابقة سيتم حفظها (حفظ EOF).
r+فتح ملف قابل للقراءة والكتابة، يجب أن يكون الملف موجودًا.
w+فتح ملف قابل للقراءة والكتابة، إذا كان الملف موجودًا، يتم إزالة طول الملف إلى صفر، مما يعني أن محتويات الملف ستختفي. إذا لم يكن الملف موجودًا، يتم إنشاؤه.
a+مثل 'a' ولكن يمكن قراءة وكتابة هذا الملف.
bفيمدية ثنائية، إذا كان الملف ملفًا ثنائيًا، يمكنك إضافة 'b'.
+الرمز '#' يعني أن يمكن قراءة وكتابة الملف.

فيمدية بسيطة

في��ية بسيطة يمكن استخدام I/O القياسية أو استخدام ملف إدخال حالي ومخرج حالي.

هذا هو كود ملف file.lua، ملف العمل هو test.lua (إذا لم يكن لديك، يجب إنشائه)، الكود كالتالي:

-- افتح الملف كقراءة فقط
file = io.open("test.lua", "r")
-- تعيين ملف الإدخال الافتراضي إلى test.lua
io.input(file)
-- إخراج السطر الأول من الملف
print(io.read())
-- إغلاق الملف المفتوح
io.close(file)
-- فتح ملف للكتابة بشكل إضافي
file = io.open("test.lua", "a")
-- تعيين ملف الإخراج الافتراضي إلى test.lua
io.output(file)
-- إضافة تعليق Lua في السطر الأخير من الملف
io.write("--  test.lua تعليق نهاية الملف")
-- إغلاق الملف المفتوح
io.close(file)

بمجرد تنفيذ الكود أعلاه، ستجد أن تم إخراج معلومات السطر الأول لملف test.lua، وأضيفت تعليقات Lua في السطر الأخير من الملف. مثل ما أظهرته هنا:

-- ملف test.lua

في الأمثلة السابقة، استخدمنا طريقة io."x"، حيث لم نضيف أي معاملات لـ io.read()، ولكن يمكن أن تكون المعاملات من الجدول التالي:

النمطالوصف
"*n"يقرأ عددًا ويعود به. مثال: file.read("*n")
"*a"يقرأ الملف بأكمله من الموقع الحالي. مثال: file.read("*a")
"*l" (الافتراضي)يقرأ السطر التالي، وعند الوصول إلى نهاية الملف (EOF) يعود nil. مثال: file.read("*l")
رقميعود بملف نصي يحتوي على عدد معين من الحروف، أو nil عند الوصول إلى نهاية الملف (EOF). مثال: file.read(5)

طرق io الأخرى تشمل:

  • io.tmpfile():يعود بملف مؤقت مفتوح في نمط التحديث، ويتم حذفه تلقائيًا عند انتهاء البرنامج

  • io.type(file): فحص obj كي يكون ملفًا معرفًا

  • io.flush(): كتابة جميع البيانات في المخزن المؤقت إلى الملف

  • io.lines(اسم الملف الاختياري): يعود بوظيفة تكرارية، وتحصل كل مرة على سطر من الملف، وعند الوصول إلى نهاية الملف تعود nil، ولكن لا يُغلق الملف

النمط الكامل

عادة، نحتاج إلى معالجة عدة ملفات في نفس الوقت. يجب استخدام file:function_name بدلاً من طريقة io:function_name. يوضح هذا المثال كيفية معالجة نفس الملف في نفس الوقت:

-- افتح الملف كقراءة فقط
file = io.open("test.lua", "r")
-- إخراج السطر الأول من الملف
print(file:read())
-- إغلاق الملف المفتوح
file:close()
-- فتح ملف للكتابة بشكل إضافي
file = io.open("test.lua", "a")
-- إضافة تعليق Lua في السطر الأخير من الملف
file:write("--test")
-- إغلاق الملف المفتوح
file:close()

بمجرد تنفيذ الكود أعلاه، ستجد أن تم إخراج معلومات السطر الأول لملف test.ua، وأضيفت تعليقات Lua في السطر الأخير من الملف. مثل ما أظهرته هنا:

-- ملف test.lua

معاملات read متطابقة مع النمط البسيط.

الطرق الأخرى:

  • file:seek(optional whence, optional offset): تعيين وتحديد موقع الملف الحالي، إذا كانت النتيجة ناجحة، فإنها تعود إلى الموقع النهائي للملف (بالمكتبات)، وإذا كانت النتيجة غير ناجحة، فإنها تعود إلى nil مع رسالة الخطأ. يمكن أن يكون قيمة المعامل whence هي:

    إذا لم يتم توفير أي معامل، فإن file:seek() يعود إلى الموقع الحالي، file:seek("set") يحدد الموقع عند بداية الملف، file:seek("end") يحدد الموقع عند نهاية الملف ويعد حجم الملف

    • "set": من بداية الملف

    • "cur": من الموقع الحالي [الافتراضي]

    • "end": من بداية النهاية

    • الـ offset: الافتراض هو 0

  • file:flush(): كتابة جميع البيانات في المخزن المؤقت إلى الملف

  • io.lines(اسم الملف الاختياري): فتح الملف المحدد filename كنمط قراءة ويعود دالة استنساخ، يتم الحصول على خط من الملف في كل مرة يتم استدعاؤها، وعند الوصول إلى نهاية الملف، يعود nil، ويتم إغلاق الملف تلقائيًا.
    إذا لم يتم توفير أي معامل، فإن io.lines() تعمل مثل io.input():lines(); تقرأ محتوى الجهاز الإدخالي الافتراضي، ولكن لا تغلق الملف عند الانتهاء، مثلًا:

    for line in io.lines("main.lua") do
      print(line)
      end

في هذا المثال، تم استخدام طريقة seek لتحديد الموقع في الملف عند 25 موضعًا من نهاية الملف واستخدام معامل *a في طريقة read، مما يعني قراءة الملف بأكمله من الموقع الحالي (25 موضعًا من نهاية الملف).

-- افتح الملف كقراءة فقط
file = io.open("test.lua", "r")
file:seek("end",-25)
print(file:read("*a"))
-- إغلاق الملف المفتوح
file:close()

النتيجة التي أخرجتها هي:

st.lua ملف النهاية --test