مقدمة
العمل مع نظام الملفات هو أحد المهام الأساسية في أي برمجة تطبيقية. في لغة C++، هناك نهجان رئيسيان: النهج الكلاسيكي (باستخدام مكتبة <fstream>) والنهج الحديث (باستخدام مكتبة <filesystem>، المتاحة بدءًا من معيار C++17). في هذه المقالة، سنشرح من خلال أمثلة عملية كيفية قراءة وكتابة الملفات، وإنشاء وحذف الدلائل، بالإضافة إلى التحقق من وجود الملفات.
ستكون المادة مفيدة لكل من المبتدئين الذين يتعلمون C++، والمطورين ذوي الخبرة الذين يرغبون في تحديث معرفتهم بالإمكانيات الحديثة للغة.
1. قراءة وكتابة الملفات النصية باستخدام fstream
توفر مكتبة <fstream> فئات للعمل مع الملفات: ifstream (للقراءة)، ofstream (للكتابة)، و fstream (للقراءة والكتابة).
1.1. كتابة البيانات إلى ملف
للكتابة إلى ملف، نستخدم كائن ofstream. إذا لم يكن الملف موجودًا، سيتم إنشاؤه. إذا كان موجودًا، سيتم استبدال المحتوى (افتراضيًا).
#include <iostream>#include <fstream>#include <string>
int main() { std::ofstream outFile("example.txt"); if (!outFile.is_open()) { std::cerr << "خطأ في فتح الملف!" << std::endl; return 1; }
outFile << "مرحبًا بالعالم!" << std::endl; outFile << "هذا هو السطر الثاني." << std::endl; outFile.close(); std::cout << "تمت كتابة البيانات." << std::endl; return 0;}لاحظ: نتحقق دائمًا مما إذا تم فتح الملف بنجاح، ونغلقه بعد الاستخدام.
1.2. قراءة البيانات من ملف
للقراءة، نستخدم ifstream. الطريقة الأسهل هي القراءة سطرًا بسطر باستخدام std::getline.
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inFile("example.txt"); if (!inFile.is_open()) { std::cerr << "خطأ في فتح الملف!" << std::endl; return 1; }
std::string line; while (std::getline(inFile, line)) { std::cout << line << std::endl; } inFile.close(); return 0;}هذه الطريقة مريحة لأنها تعالج نهاية الملف تلقائيًا ولا تتطلب فحوصات إضافية.
1.3. أوضاع فتح الملف
يمكنك دمج العلامات للتحكم في وضع الفتح. على سبيل المثال، لإضافة بيانات إلى نهاية الملف (وضع الإلحاق)، استخدم العلامة std::ios::app:
std::ofstream outFile("example.txt", std::ios::app);outFile << "سطر إضافي." << std::endl;outFile.close();علامات مفيدة أخرى: std::ios::binary (الوضع الثنائي)، std::ios::trunc (مسح الملف عند الفتح).
2. العمل الحديث مع نظام الملفات (C++17 و filesystem)
مكتبة <filesystem> تبسط بشكل كبير التعامل مع الملفات والمجلدات. جميع الوظائف موجودة في مساحة الأسماء std::filesystem.
2.1. التحقق من وجود ملف أو دليل
الدالة exists() ترجع true إذا كان الكائن موجودًا:
#include <iostream>#include <filesystem>
namespace fs = std::filesystem;
int main() { std::string path = "example.txt"; if (fs::exists(path)) { std::cout << "الملف موجود." << std::endl; } else { std::cout << "الملف غير موجود." << std::endl; } return 0;}2.2. إنشاء وحذف الدلائل
لإنشاء مجلد، استخدم create_directory(). للحذف، استخدم remove() أو remove_all() (الحذف التكراري).