العمل مع نظام الملفات في لغة C++: من الأساسيات إلى التقنيات المتقدمة
العمل مع نظام الملفات هو أحد المهام الأساسية عند التطوير بلغة C++. سواء كان حفظ إعدادات التطبيق، معالجة السجلات، أو إنشاء أنظمة معقدة لإدارة البيانات - فإن القدرة على قراءة وكتابة ومعالجة الملفات والمجلدات ضرورية لكل مطور C++. في هذه المقالة، سنستعرض كلاً من الطرق التقليدية للعمل مع الملفات عبر fstream، والنهج الحديث باستخدام مكتبة std::filesystem (C++17 والإصدارات الأحدث).
أساسيات العمل مع الملفات: مكتبة fstream
توفر مكتبة fstream (<fstream>) ثلاث فئات رئيسية للعمل مع الملفات:
ifstream- للقراءة من ملف (input file stream);ofstream- للكتابة في ملف (output file stream);fstream- للقراءة والكتابة في نفس الوقت.
قراءة البيانات من ملف
لننظر إلى مثال بسيط لفتح وقراءة ملف نصي سطراً بسطر:
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inputFile("data.txt"); if (!inputFile.is_open()) { std::cerr << "خطأ في فتح الملف!" << std::endl; return 1; }
std::string line; while (std::getline(inputFile, line)) { std::cout << line << std::endl; }
inputFile.close(); return 0;}من المهم دائماً التحقق من نجاح فتح الملف باستخدام الدالة is_open(). سيتم إغلاق الملف تلقائياً عند الخروج من نطاق الرؤية، لكن الاستدعاء الصريح لـ close() يعتبر ممارسة جيدة.
كتابة البيانات إلى ملف
تتم الكتابة إلى ملف بشكل مشابه للإخراج إلى وحدة التحكم - باستخدام عامل التشغيل <<:
#include <fstream>
int main() { std::ofstream outputFile("output.txt"); if (!outputFile) { std::cerr << "فشل إنشاء الملف!" << std::endl; return 1; }
outputFile << "السطر 1" << std::endl; outputFile << "السطر 2" << std::endl; outputFile << 42 << std::endl; // الأرقام تُكتب تلقائياً كنص
outputFile.close(); return 0;}بشكل افتراضي، يقوم ofstream بإعادة كتابة الملف. لإضافة بيانات إلى النهاية، استخدم العلم std::ios::app:
std::ofstream outputFile("log.txt", std::ios::app);الملفات الثنائية والوصول العشوائي
للعمل مع البيانات الثنائية، استخدم العلم std::ios::binary. تسمح الدالتان read() و write() بالعمل مع كتل الذاكرة:
#include <fstream>
struct Record { int id; char name[50];};
int main() { // كتابة الهيكل Record rec = {1, "مثال"}; std::ofstream binOut("data.bin", std::ios::binary); binOut.write(reinterpret_cast<char*>(&rec), sizeof(rec)); binOut.close();
// قراءة الهيكل Record recIn; std::ifstream binIn("data.bin", std::ios::binary); binIn.read(reinterpret_cast<char*>(&recIn), sizeof(recIn)); binIn.close();
return 0;}لتحديد الموضع داخل الملف، استخدم seekg() (للإدخال) و seekp() (للإخراج) مع المعاملات std::ios::beg أو std::ios::cur أو std::ios::end.
C++ الحديثة: مكتبة std::filesystem
ابتداءً من C++17، تم تضمين وحدة std::filesystem في المكتبة القياسية، والتي تبسط بشكل كبير العمل مع نظام الملفات. توفر دوالاً مريحة للتعامل مع المسارات والملفات والمجلدات.