كورس C++ المتوسط – الحلقة السادسة: التعامل مع الملفات بشكل احترافي (Advanced File Handling)
#برمجة
مقدمة
مرحباً بك في الحلقة السادسة من المستوى المتوسط في C++.
في الحلقة السابقة تعلمنا:
- Inheritance
- Polymorphism
- Virtual Functions
- Abstract Classes
- OOP المتقدم
واليوم سنتعلم أحد أهم المواضيع في بناء البرامج الحقيقية:
التعامل مع الملفات بشكل احترافي
في الدروس الأساسية تعلمنا:
- إنشاء ملف
- الكتابة داخل ملف
- القراءة من ملف
أما اليوم فسنتعلم:
- إدارة البيانات
- تخزين المستخدمين
- إنشاء قاعدة بيانات نصية بسيطة
- تحديث البيانات
- حذف البيانات
- بناء مشروع عملي كامل
لماذا نحتاج الملفات؟
لنفترض أنك أنشأت برنامجاً للمستخدمين.
إذا أغلق المستخدم البرنامج ستضيع جميع البيانات.
مثال:
اسم المستخدم: Ahmed
العمر: 20
عند إغلاق البرنامج تختفي البيانات من الذاكرة.
الحل:
حفظها داخل ملف.
مراجعة سريعة
الكتابة داخل ملف
ofstream file("users.txt");
file << "Ahmed";
file.close();
القراءة من ملف
ifstream file("users.txt");
string name;
file >> name;
cout << name;
التحقق من نجاح فتح الملف
من الأخطاء الشائعة أن نفترض أن الملف تم فتحه بنجاح.
الأفضل:
ifstream file("users.txt");
if(file.is_open())
{
cout << "Opened";
}
else
{
cout << "Error";
}
قراءة الملف سطراً سطراً
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream file("users.txt");
string line;
while(getline(file, line))
{
cout << line << endl;
}
file.close();
return 0;
}
لماذا getline أفضل؟
لأن:
Ahmed Ali
سيتم قراءته كاملاً.
بينما:
file >> name;
ستقرأ فقط:
Ahmed
حفظ عدة مستخدمين
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream file("users.txt", ios::app);
file << "Ahmed,20" << endl;
file << "Ali,18" << endl;
file.close();
return 0;
}
شكل الملف
Ahmed,20
Ali,18
إنشاء قاعدة بيانات نصية بسيطة
كل سطر يمثل مستخدماً.
مثال:
Ahmed,20
Ali,18
Khaled,25
مشروع 1: إضافة مستخدم
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
string name;
int age;
cout << "Name: ";
getline(cin, name);
cout << "Age: ";
cin >> age;
ofstream file("users.txt", ios::app);
file << name << "," << age << endl;
file.close();
cout << "Saved";
return 0;
}
مشروع 2: عرض المستخدمين
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream file("users.txt");
string line;
while(getline(file, line))
{
cout << line << endl;
}
file.close();
return 0;
}
عد عدد المستخدمين
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream file("users.txt");
string line;
int count = 0;
while(getline(file, line))
{
count++;
}
cout << "Users: " << count;
file.close();
return 0;
}
البحث عن مستخدم
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
string target;
cout << "Search: ";
getline(cin, target);
ifstream file("users.txt");
string line;
bool found = false;
while(getline(file, line))
{
if(line.find(target) != string::npos)
{
found = true;
cout << line << endl;
}
}
if(!found)
{
cout << "Not Found";
}
file.close();
return 0;
}
شرح find()
line.find("Ahmed")
إذا وجدت الكلمة تعيد موقعها داخل النص.
إذا لم تجدها تعيد:
string::npos
تحديث البيانات
الملفات النصية لا تسمح بتعديل السطر مباشرة بسهولة.
الطريقة الاحترافية:
- قراءة الملف
- إنشاء ملف مؤقت
- نسخ البيانات
- تعديل المطلوب
- استبدال الملف القديم
مثال مبسط
ifstream oldFile("users.txt");
ofstream tempFile("temp.txt");
ثم ننقل البيانات المعدلة.
حذف مستخدم
نفس الفكرة.
ننسخ كل السطور ما عدا السطر المطلوب حذفه.
مشروع مصغر: سجل ملاحظات
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
string note;
cout << "Write Note: ";
getline(cin, note);
ofstream file("notes.txt", ios::app);
file << note << endl;
file.close();
cout << "Saved";
return 0;
}
عرض الملاحظات
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream file("notes.txt");
string note;
while(getline(file, note))
{
cout << note << endl;
}
file.close();
return 0;
}
مشروع متوسط: نظام تسجيل دخول
حفظ الحساب
file << username << "," << password << endl;
التحقق
نقرأ الملف ونقارن:
if(line == username + "," + password)
{
cout << "Login Success";
}
أوضاع فتح الملفات
| الوضع | الوظيفة |
|---|---|
| ios::in | قراءة |
| ios::out | كتابة |
| ios::app | إضافة |
| ios::trunc | حذف المحتوى القديم |
| ios::binary | ملفات ثنائية |
ما هي الملفات الثنائية؟
حتى الآن استخدمنا:
Ahmed,20
وهذه ملفات نصية.
أما الملفات الثنائية:
ios::binary
فتُستخدم لحفظ البيانات بشكل أسرع وأكثر احترافية.
سندرسها بالتفصيل في المستوى المتقدم.
أخطاء شائعة
❌ نسيان close()
❌ نسيان التحقق من فتح الملف
❌ استخدام cin مع النصوص الطويلة
❌ الكتابة فوق البيانات القديمة بدون ios::app
تمارين
التمرين 1
أنشئ برنامجاً يحفظ أسماء الطلاب.
التمرين 2
اعرض جميع الطلاب من الملف.
التمرين 3
ابحث عن طالب بالاسم.
التمرين 4
احسب عدد السطور داخل الملف.
التمرين 5
أنشئ نظام ملاحظات بسيط.
مشروع تطبيقي مقترح
اصنع برنامجاً يحتوي على قائمة:
1- Add User
2- View Users
3- Search User
4- Count Users
5- Exit
واستخدم الملفات لتخزين البيانات.
ملخص الحلقة السادسة
في هذه الحلقة تعلمنا:
- القراءة الاحترافية من الملفات
- getline
- البحث داخل الملفات
- إنشاء قاعدة بيانات نصية بسيطة
- حفظ المستخدمين
- أنظمة الملاحظات
- أوضاع فتح الملفات
في الحلقة السابعة من المستوى المتوسط سنتعلم:
🔥 الـ Structures و Enumerations
وسنبني:
- نظام طلاب احترافي
- إدارة بيانات منظمة
- تمهيداً للانتقال إلى Data Structures الحقيقية مثل Linked Lists و Trees. 🚀

تعليقات
إرسال تعليق