الكتابة إلى الملفات وإلحاق البيانات بها
اكتب السلاسل النصية إلى الملفات وألحِق البيانات دون الكتابة فوق المحتوى السابق
الكتابة إلى الملفات وإلحاق البيانات بها درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
أساسيات f:write()
تكتب f:write(...) سلسلة نصية واحدة أو أكثر (أو أعدادًا) إلى الملف. ولا تضيف محارف سطر جديد تلقائيًا. وتعيد مقبض الملف عند النجاح (مما يتيح تسلسل الاستدعاءات)، أو تعيد nil, errMessage, errCode عند الفشل.
local f = io.open("output.txt", "w")
if f then
f:write("Hello, ")
f:write("World")
f:write("!\n")
f:write("Line 2\n")
f:close()
endكتابة قيم متعددة
تقبل f:write() عدة وسائط وتكتبها كلها بالتتابع. يجب أن تكون القيم سلاسل نصية أو أعدادًا؛ إذ يؤدي تمرير أنواع أخرى إلى حدوث خطأ. استخدموا tostring() لتحويل القيم المنطقية والجداول وغير ذلك.
local f = io.open("log.txt", "w")
f:write("Name: ", "Alice", "\n")
f:write("Age: ", 30, "\n")
f:write("Score: ", string.format("%.1f", 95.5), "\n")
f:close()الكتابة المنسقة
ادمجوا string.format مع f:write للحصول على إخراج دقيق. يُستخدم هذا النمط عادةً لإنشاء التقارير وملفات السجل وتصدير البيانات التي تتطلب تنسيقًا محددًا.
local data = {
{name="Alice", score=95, grade="A"},
{name="Bob", score=87, grade="B"},
}
local f = io.open("report.txt", "w")
f:write(string.format("%-12s %5s %s\n","Name","Score","Grade"))
f:write(string.rep("-",25) .. "\n")
for _, r in ipairs(data) do
f:write(string.format("%-12s %5d %s\n",r.name,r.score,r.grade))
end
f:close()وضع الإلحاق
يكتب الوضع "a" دائمًا في نهاية الملف. يكون موضع الملف عند القراءة في البداية، لكن عمليات الكتابة تتجه دائمًا إلى النهاية. استخدموه لملفات السجل ومسارات التدقيق وأي ملف تريدون إضافة محتوى إليه من دون مسح محتواه.
local function appendLog(msg)
local f = io.open("app.log", "a")
if f then
local ts = os.date("%Y-%m-%d %H:%M:%S")
f:write(string.format("[%s] %s\n", ts, msg))
f:close()
end
end
appendLog("Server started")
appendLog("User logged in: Alice")
appendLog("Request processed")f:flush() والتخزين المؤقت
تستخدم عمليات إدخال وإخراج الملفات في Lua التخزين المؤقت. قد تبقى البيانات المكتوبة باستخدام f:write() في مخزن مؤقت قبل وصولها إلى القرص. تفرض f:flush() كتابة المخزن المؤقت إلى القرص من دون إغلاق الملف. احرصوا دائمًا على تفريغ المخزن المؤقت قبل حاجة عملية أخرى إلى رؤية البيانات.
local f = io.open("stream.txt", "w")
for i = 1, 5 do
f:write("Line " .. i .. "\n")
f:flush() -- ensure each line is on disk
-- simulate work
end
f:close()كتابة البيانات الثنائية
في وضع الكتابة الثنائية ("wb")، اكتبوا البايتات الخام باستخدام string.char(). هذه هي الطريقة المستخدمة لإنشاء تنسيقات الملفات الثنائية أو الصور أو رسائل البروتوكولات. استخدموا string.pack (في Lua 5.3+) للبيانات الثنائية المهيكلة.
local f = io.open("bytes.bin", "wb")
if f then
-- Write raw bytes
f:write(string.char(0xFF, 0x00, 0xAB, 0xCD))
-- Write a 4-byte little-endian integer (Lua 5.3+)
f:write(string.pack("<I4", 12345))
f:close()
print("Written binary file")
endio.write مقابل f:write
تكتب io.write() إلى الإخراج الافتراضي الحالي (وهو stdout مبدئيًا). أما f:write() فتكتب إلى مقبض ملف محدد. وعلى خلاف print()، لا تضيف أي منهما محرف سطر جديد أو فواصل علامات تبويب، مما يمنحكم تحكمًا كاملًا في تنسيق الإخراج.
-- io.write to stdout
io.write("Enter name: ")
-- (would read input here)
-- f:write to file
local f = io.open("out.txt", "w")
f:write("No auto newline")
f:write(" appended directly")
f:write("\n") -- explicit newline
f:close()
-- print adds tabs and newline automatically
print("a", "b", "c") -- a b c (tab-separated)نمط الكتابة الذرية
لضمان الأمان، اكتبوا في ملف مؤقت أولًا، ثم أعيدوا تسميته. يؤدي ذلك إلى تجنب الفترة التي يكون فيها ملف الإخراج مكتوبًا جزئيًا. وإذا تعطل البرنامج أثناء الكتابة، يظل الملف الأصلي دون تغيير.
local function atomicWrite(path, content)
local tmp = path .. ".tmp"
local f, err = io.open(tmp, "w")
if not f then return nil, err end
f:write(content)
f:close()
-- os.rename is atomic on most filesystems
local ok, err2 = os.rename(tmp, path)
if not ok then
os.remove(tmp)
return nil, err2
end
return true
endكتابة الجداول بصيغة CSV
حوّلوا جدولًا من السجلات إلى تنسيق CSV: اكتبوا صف العناوين، ثم صفًا لكل سجل، مع تحويل جميع القيم إلى سلاسل نصية وربطها بفواصل.
local function writeCSV(path, headers, rows)
local f = io.open(path, "w")
if not f then return end
f:write(table.concat(headers, ",") .. "\n")
for _, row in ipairs(rows) do
local fields = {}
for _, h in ipairs(headers) do
fields[#fields+1] = tostring(row[h] or "")
end
f:write(table.concat(fields, ",") .. "\n")
end
f:close()
end
writeCSV("data.csv",
{"name","age","score"},
{{name="Alice",age=30,score=95},{name="Bob",age=25,score=87}}
)القيمة المعادة من f:write
تعيد f:write() مقبض الملف عند النجاح، مما يتيح تسلسل استدعاءات الأساليب. وعند الفشل، تعيد nil ورسالة خطأ ورمز خطأ. تحققوا دائمًا من الأخطاء في كود الإنتاج، ولا سيما عند إجراء عمليات الكتابة على أنظمة محدودة التخزين.
local f = io.open("out.txt", "w")
-- Chaining writes
local ok, err = f:write("line1\n"):write("line2\n"):write("line3\n")
if not ok then
print("Write failed:", err)
else
print("All writes succeeded")
end
f:close()تحقق سريع
ما الفرق بين الوضعين "w" و"a" في io.open؟
مراجعة: كتابة الملفات
الملخص:
f:write(...)— كتابة السلاسل النصية أو الأعداد؛ من دون سطر جديد تلقائي"w"يقتطع المحتوى، و"a"يلحق المحتوىf:flush()يفرض كتابة المخزن المؤقت إلى القرصio.write()تكتب إلى الإخراج الافتراضي (stdout)- الكتابة الذرية: اكتبوا في ملف مؤقت ثم أعيدوا تسميته
- تحققوا من القيم المعادة من عمليات الكتابة في كود الإنتاج
الأسئلة الشائعة
هل درس «الكتابة إلى الملفات وإلحاق البيانات بها» مجاني؟
نعم — نص درس «الكتابة إلى الملفات وإلحاق البيانات بها» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «الكتابة إلى الملفات وإلحاق البيانات بها»؟
اكتب السلاسل النصية إلى الملفات وألحِق البيانات دون الكتابة فوق المحتوى السابق تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الكتابة إلى الملفات وإلحاق البيانات بها»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فتح الملفات باستخدام io.open
- قراءة محتويات الملفات
- الكتابة إلى الملفات وإلحاق البيانات بها
- إغلاق الملفات ومعالجة الأخطاء