0Pricing
Lua Academy · درس

قراءة محتويات الملفات

اقرأ الأسطر والبايتات والمحتوى الكامل باستخدام أساليب file:read()

قراءة محتويات الملفات درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

قراءة الملف بأكمله

استخدموا f:read("a") (أو "*a") لقراءة الملف بأكمله في سلسلة نصية. هذه الطريقة بسيطة ومناسبة للملفات الصغيرة والمتوسطة. أما الملفات الكبيرة جدًا، فاقرؤوها على دفعات أو سطرًا سطرًا لتجنب مشكلات الذاكرة.

local f = io.open("config.txt", "r")
if f then
  local content = f:read("a")
  f:close()
  print("Size:", #content, "bytes")
  print(content)
end

القراءة سطرًا سطرًا

تقرأ f:read("l") السطر التالي مع إزالة محرف السطر الجديد. وتعيد nil عند الوصول إلى نهاية الملف. استخدموا while لمعالجة كل سطر. ويُعد f:lines() الاختصار الاصطلاحي الذي ينفذ الأمر نفسه.

local f = io.open("data.txt", "r")
if f then
  local line = f:read("l")
  while line ~= nil do
    print(line)
    line = f:read("l")
  end
  f:close()
end

-- Equivalent with for loop:
-- for line in io.lines("data.txt") do print(line) end

قراءة عدد ثابت من البايتات

مرّروا عددًا إلى f:read(n) لقراءة n من البايتات بالضبط. وتعيد الدالة سلسلة نصية تحتوي على ما يصل إلى n من البايتات (أقل من ذلك إذا تم الوصول إلى نهاية الملف)، أو تعيد nil عند نهاية الملف. استخدموا ذلك مع البروتوكولات الثنائية أو تنسيقات الملفات المهيكلة.

local f = io.open("binary.dat", "rb")
if f then
  -- Read 4-byte header
  local header = f:read(4)
  if header then
    print("Header bytes:", #header)
    for i = 1, #header do
      io.write(string.format("%02X ", header:byte(i)))
    end
    print()
  end
  f:close()
end

قراءة عدد

تقرأ f:read("n") العدد التالي من الملف، مع تخطي المسافات البيضاء. وتعيد عددًا بصيغة Lua، أو nil إذا لم يكن الرمز التالي عددًا. يفيد ذلك في قراءة ملفات البيانات الرقمية المهيكلة.

-- File contains: "10 20 30.5 40"
local f = io.open("nums.txt", "r")
if f then
  local total = 0
  local n = f:read("n")
  while n do
    total = total + n
    n = f:read("n")
  end
  f:close()
  print("Sum:", total)
end

التنقل داخل الملفات

تنقل f:seek(whence, offset) موضع الملف. تكون قيمة whence هي "set" (من البداية)، أو "cur" (من الموضع الحالي)، أو "end" (من النهاية). وتعيد الموضع المطلق الجديد. استخدموها لإعادة القراءة أو للانتقال بين مواضع الملف.

local f = io.open("test.txt", "r")
if f then
  -- Jump to end, get file size
  local size = f:seek("end")
  print("File size:", size, "bytes")
  
  -- Seek back to start
  f:seek("set", 0)
  local first_line = f:read("l")
  print("First line:", first_line)
  f:close()
end

قراءة ملفات CSV

حلّلوا بيانات CSV سطرًا سطرًا: اقرأوا كل سطر، ثم قسّموه عند الفواصل باستخدام string.gmatch. وللاستخدام في بيئة الإنتاج، عالجوا الحقول الموضوعة بين علامتي اقتباس والفواصل الموجودة داخلها، أما مع البيانات البسيطة فيكفي التقسيم الأساسي.

local function parseCSV(path)
  local rows = {}
  for line in io.lines(path) do
    local row = {}
    for field in string.gmatch(line, "([^,]+)") do
      row[#row+1] = field
    end
    rows[#rows+1] = row
  end
  return rows
end

-- Example: "Alice,30,Engineer"
-- => {{"Alice","30","Engineer"}}

قراءة ملفات الإعدادات

تنسيق بسيط للإعدادات باستخدام key=value: اقرأوا الملف سطرًا سطرًا، وتخطّوا التعليقات والأسطر الفارغة، ثم حلّلوا أزواج key=value باستخدام string.match.

local function loadConfig(path)
  local cfg = {}
  for line in io.lines(path) do
    -- Skip comments and blank lines
    if not line:match("^%s*#") and line:match("%S") then
      local k, v = line:match("^%s*(%w+)%s*=%s*(.-)%s*$")
      if k then cfg[k] = v end
    end
  end
  return cfg
end

local config = loadConfig("app.conf")
print(config.host, config.port)

القراءة على دفعات

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

local function processLarge(path, chunkSize)
  chunkSize = chunkSize or 4096
  local f, err = io.open(path, "rb")
  if not f then return nil, err end
  local totalBytes = 0
  local chunk = f:read(chunkSize)
  while chunk do
    totalBytes = totalBytes + #chunk
    -- process chunk here
    chunk = f:read(chunkSize)
  end
  f:close()
  return totalBytes
end

قراءة قيم متعددة في كل سطر

عندما يحتوي كل سطر على قيم متعددة مفصولة بمسافات أو بعلامات تبويب، استخدموا string.match أو string.gmatch لاستخراجها. يتعامل هذا النمط مع ملفات النصوص المهيكلة البسيطة.

-- File: "Alice 95 A\nBob 87 B"
local results = {}
for line in io.lines("grades.txt") do
  local name, score, grade = line:match("(%S+)%s+(%d+)%s+(%S+)")
  if name then
    results[#results+1] = {
      name=name,
      score=tonumber(score),
      grade=grade
    }
  end
end

for _, r in ipairs(results) do
  print(r.name, r.score, r.grade)
end

اختصار io.lines

تفتح io.lines(filename) الملف، وتعيد مكرّرًا للأسطر، ثم تغلق الملف عند الانتهاء. وهي الطريقة الأكثر اختصارًا لقراءة ملف سطرًا سطرًا من دون إدارة المقبض صراحةً.

-- Count non-empty lines
local count = 0
for line in io.lines("data.txt") do
  if line:match("%S") then
    count = count + 1
  end
end
print("Non-empty lines:", count)

-- Collect all lines into a table
local lines = {}
for line in io.lines("data.txt") do
  lines[#lines+1] = line
end
print("Total lines:", #lines)

تحقق سريع

ماذا تعيد f:read("a") عندما يكون مؤشر الملف عند نهاية الملف مسبقًا؟

مراجعة: قراءة الملفات

الملخص:

  • f:read("a") — الملف بأكمله كسلسلة نصية
  • f:read("l") — سطر واحد من دون محرف السطر الجديد
  • f:read(n) — عدد n من البايتات بالضبط
  • f:read("n") — العدد التالي
  • io.lines(path) — مكرّر للأسطر يغلق الملف تلقائيًا
  • f:seek() — الانتقال إلى موضع

الأسئلة الشائعة

هل درس «قراءة محتويات الملفات» مجاني؟

نعم — نص درس «قراءة محتويات الملفات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «قراءة محتويات الملفات»؟

اقرأ الأسطر والبايتات والمحتوى الكامل باستخدام أساليب file:read() تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «قراءة محتويات الملفات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

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

جميع الدروس في هذه الدورة

  1. فتح الملفات باستخدام io.open
  2. قراءة محتويات الملفات
  3. الكتابة إلى الملفات وإلحاق البيانات بها
  4. إغلاق الملفات ومعالجة الأخطاء
← العودة إلى Lua Academy