العمل مع نظام الملفات في C++: من الأساسيات إلى التقنيات المتقدمة
العمل مع نظام الملفات هو إحدى المهام الأساسية في أي تطبيق جاد بلغة C++. سواء كان قراءة ملفات التكوين، أو كتابة السجلات، أو معالجة كميات كبيرة من البيانات، أو إدارة المشاريع - فإن القدرة على التفاعل بشكل صحيح مع الملفات والدلائل ضرورية لكل مطور C++. في هذه المقالة، سنستعرض الأساليب الرئيسية للعمل مع نظام الملفات في C++، بدءًا من دوال C الكلاسيكية وصولاً إلى std::filesystem الحديث الذي ظهر في C++17.
سننظر في أمثلة عملية ستساعدك ليس فقط على فهم النظرية، ولكن أيضًا على تطبيق المعرفة المكتسبة فورًا في مشاريع حقيقية. جميع أمثلة الكود تم اختبارها وجاهزة للاستخدام.
1. أساسيات العمل مع الملفات: تدفقات الإدخال/الإخراج
الطريقة الأكثر شيوعًا للعمل مع الملفات في C++ هي استخدام مكتبة <fstream>. وهي توفر ثلاث فئات رئيسية:
std::ifstream- للقراءة من ملف (input file stream);std::ofstream- للكتابة إلى ملف (output file stream);std::fstream- للقراءة والكتابة (file stream).
القراءة من ملف
لقراءة البيانات من ملف، قم بإنشاء كائن std::ifstream وافتح الملف. أسهل طريقة لقراءة ملف سطرًا بسطر هي استخدام الدالة std::getline:
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inputFile("example.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() - هذه ممارسة مهمة تمنع تعطل البرنامج في حالة عدم وجود الملف.
الكتابة إلى ملف
لكتابة البيانات، يتم استخدام std::ofstream. افتراضيًا، يتم إنشاء الملف من جديد (وضع trunc). إذا كنت بحاجة إلى إضافة بيانات في النهاية، استخدم العلم std::ios::app:
#include <iostream>#include <fstream>
int main() { std::ofstream outputFile("output.txt", std::ios::app); if (!outputFile.is_open()) { std::cerr << "خطأ في إنشاء الملف!" << std::endl; return 1; }
outputFile << "السطر 1" << std::endl; outputFile << "السطر 2" << std::endl; outputFile << "رقم: " << 42 << std::endl;
outputFile.close(); return 0;}العمل مع الملفات الثنائية
للبيانات الثنائية، استخدم الطريقتين read() و write() مع تحديد حجم الكتلة:
#include <iostream>#include <fstream>#include <cstring>
struct Record { int id; char name[50]; double value;};
int main() { // كتابة Record r = {1, "سجل اختباري", 3.14}; std::ofstream binOut("data.bin", std::ios::binary); binOut.write(reinterpret_cast<const char*>(&r), sizeof(r)); binOut.close();
// قراءة Record r2; std::ifstream binIn("data.bin", std::ios::binary); binIn.read(reinterpret_cast<char*>(&r2), sizeof(r2)); binIn.close();
std::cout << "ID: " << r2.id << ", Name: " << r2.name << ", Value: " << r2.value << std::endl; return 0;}2. النهج الحديث: مكتبة std::filesystem (C++17)
بدءًا من C++17، تمت إضافة <filesystem> إلى المكتبة القياسية، مما يبسط بشكل كبير العمل مع نظام الملفات. O