🔥 أحدث الأخبار

موقع يهتم بكل ماهو جديد في عالم التكنولوجيا والرياضة

كورس C++ المتوسط – الحلقة السادسة: التعامل مع الملفات بشكل احترافي (Advanced File Handling)


 

كورس 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

تحديث البيانات

الملفات النصية لا تسمح بتعديل السطر مباشرة بسهولة.

الطريقة الاحترافية:

  1. قراءة الملف
  2. إنشاء ملف مؤقت
  3. نسخ البيانات
  4. تعديل المطلوب
  5. استبدال الملف القديم

مثال مبسط

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. 🚀

تعليقات

💬 🙋🏻‍♂️